Wpis z mikrobloga

Tabela A:

Id,
...,
TeamName

Tabela B:

Id,
AId, (referencja do A)
...,
TeamName

Chciałbym żeby przy dodawaniu rekordu to Tabeli B wywalało błąd jeżeli TeamName będzie inny niż TeamName dla referencji rekordu w Tabeli A. Da się zrobić takiego constrainta?

#bazydanych #sql #programowanie
  • 15
@koxok: w pewnych przypadkach do tabeli B dane będą dodawane i pobierane niezależnie.
Chciałbym mieć dostęp do TeamName w tabeli B bez konieczności JOIN'a oraz dodawać rekordy bez wcześniejszego pobierania rekordów z tabeli A w celu walidacji.
@tewe: to co najwyzej w procedurze do dodawania bym sprawdzal, czy istnieje taki TeamName w Tabeli A. No i nie wiadomo, na jakim silniku się opierasz, więc mówie tylko o MSSQL.
@koxok: MSSQL here, musiałbym sprawdzać czy istnieje taki TeamName dla danego Id w tabeli A. Co oznacza łączenie się z tą tabelą, zgadza się?
Jeżeli nie mogę założyć jakiegoś constrainta to trudno - już w kontrolerze w API będę sobie to walidował, ale chciałem tego uniknąć.
@koxok: no tak, ale to wciąż jest select do tabeli A, a ja się zastanawiam czy da się tego uniknąć.
Zwyczajnie żeby SQL rzucało error tak samo jak próbujesz dodać referencję do klucza, który nie istnieje :P
@tewe: to jak chcesz sprawdzic, czy cos jest w tabeli a bez sprawdzenia jej xD

no chyba, ze masz skonczoną ilość wartości jakie można tam włożyć, to wtedy bez problemu mozesz ominac A
@tewe:
Nie do końca może o to Ci chodzić, ale da radę to wykonać tworząc klucz złożony/kompozytowy na kolumnę Id i TeamName. Poza tym możesz jeszcze stworzyć trigger albo constraint z funkcją (która pobiera dane z tabeli obcej), ale tutaj performance może być słaby
@obieq - ale to wymaga połączenia z drugą tabelą, a ja zastanawiałem się czy można to zrobić bez select'a.

@Priya - działa. co masz na myśli? mogę niezależnie dodawać i aktualizować rekordy w tabeli A.

ALTER TABLE TableA
ADD UNIQUE (Id, TeamName)

ALTER TABLE TableB
ADD FOREIGN KEY(Id, TeamName)
REFERENCES TableA(Id, TeamName)
ON DELETE CASCADE
ON UPDATE CASCADE;

Teraz muszę to napisać w CodeFirst w entity framework ( ͡° ͜ʖ