Toon posts:

[SQL] Constraint meerdere tabellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Situatie:

Ik werk met SQL server 2005. Ik wil een constraint toevoegen. Dit doe ik met behulp van

ALTER TABLE <Tabel naam> ADD CONSTRAINT <Naam constraint>
CHECK <Voorwaarden>

Ik wil nu een constraint maken dat checkt of een waarde in de ene tabel gelijk is aan de waarde in de andere tabel. In mijn geval: Medewerker.kantoornr gelijk aan Woonruimte.kantoornr. Het moet gemaakt worden in de tabel: Woonruimte.

Het volgende werkt niet:

ALTER TABLE [WOONRUIMTE] ADD CONSTRAINT Foo1
CHECK (Medewerker.kantoornr = Woonruimte.kantoornr)

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:02
Wat jij wil, is een foreign key contraint aanmaken :)

What do you mean I have no life? I am a gamer, I got millions!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op woensdag 17 januari 2007 @ 12:09:
Ik wil nu een constraint maken dat checkt of een waarde in de ene tabel gelijk is aan de waarde in de andere tabel.
Als aanvulling op Morax:
Als je met die zin bedoelt "de waarde in medewerkers moet in woonruimte staan", dan zoek je waarschijnlijk een foreign key ja. Als er bijzondere eisen zijn aan die "de waarde in de andere tabel", dan kan het zijn dat je een complexere constraint nodig hebt (die niet alle databases ondersteunen en mijn kennis van SQL Server is te beperkt om te weten of die het wel doet) met bijvoorbeeld een select-query of een zelf geschreven function in de check-contraint ingebed.

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:02
ACM schreef op woensdag 17 januari 2007 @ 12:14:
[...]

Als aanvulling op Morax:
Als je met die zin bedoelt "de waarde in medewerkers moet in woonruimte staan", dan zoek je waarschijnlijk een foreign key ja. Als er bijzondere eisen zijn aan die "de waarde in de andere tabel", dan kan het zijn dat je een complexere constraint nodig hebt (die niet alle databases ondersteunen en mijn kennis van SQL Server is te beperkt om te weten of die het wel doet) met bijvoorbeeld een select-query of een zelf geschreven function in de check-contraint ingebed.
Gezien zijn voorbeeld helemaal onderaan de post, vermoed ik dat hij alleen een foreign key restraint nodig heeft :)

What do you mean I have no life? I am a gamer, I got millions!


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Als het dus geen foreign key behelst, kan je dit niet met een constraint doen, maar zal je een trigger nodig hebben.
AFAIK kunnen constraints enkel toegepast worden op velden binnen eenzelfde tabel; gaat het over waardes die over verschillende tabellen verspreid zijn, dan heb je een trigger nodig.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ALTER TABLE empADD CONSTRAINT ck_fk CHECK( 0 < (select count(1) from dept where dept.deptno=emp.deptno) )

Dit is waarschijnlijk de oplossing. Ga het zo testen. Ik was niet op zoek naar een foreign key. Die kan je overal vinden. Maar ik moet checken of het kantoornr van woonruimte hetzelfde is als die van medewerker.

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:02
whoami schreef op woensdag 17 januari 2007 @ 12:28:
Als het dus geen foreign key behelst, kan je dit niet met een constraint doen, maar zal je een trigger nodig hebben.
AFAIK kunnen constraints enkel toegepast worden op velden binnen eenzelfde tabel; gaat het over waardes die over verschillende tabellen verspreid zijn, dan heb je een trigger nodig.
Weet je zeker dat daar geen statement voor is? Ik ben niet bekend met SQL Server, maar in MySQL kan je in je CREATE TABLE statements iets toevoegen als
SQL:
1
2
FOREIGN KEY ( kolom_in_deze_tabel )
REFERENCES andere_tabel ( kolom_in_andere_tabel )

What do you mean I have no life? I am a gamer, I got millions!


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Ja, dat is een foreign key; dat heb je natuurlijk in SQL Server 8)7
Echter, ik zei: als het iets anders is dan een FK dat je zoekt, moet je het met een trigger oplossen.

https://fgheysels.github.io/


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

whoami schreef op woensdag 17 januari 2007 @ 12:28:
AFAIK kunnen constraints enkel toegepast worden op velden binnen eenzelfde tabel; gaat het over waardes die over verschillende tabellen verspreid zijn, dan heb je een trigger nodig.
Dat is in postgresql in ieder geval op te lossen door een functie te gebruiken, waarbij je de select naar een andere tabel in de functie doet en je dus effectief een select-query in je constraint hebt, zoiets kan in mssql vast ook wel :)
Verwijderd schreef op woensdag 17 januari 2007 @ 12:53:
Dit is waarschijnlijk de oplossing. Ga het zo testen. Ik was niet op zoek naar een foreign key. Die kan je overal vinden. Maar ik moet checken of het kantoornr van woonruimte hetzelfde is als die van medewerker.
Je maakt het nog steeds niet erg duidelijk en je voorbeeldoplossing doet zo te zien niet wat je hier zelf zegt. Sterker nog, als ik het goed zie is het gewoon een foreign key (het zal vast niet voor de grap 'ck_fk' heten).

Wat jij blijkbaar wil is een uitgebreidere versie van die check-constraint, namelijk dat zowel het deptno als het empno overeen komen. Overigens mag je vziw ook multi-column foreign key constraints doen, dus zoiets kan dan ook:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
create table empdept (
  empno int not null,
  deptno int not null
)

create table foo (
  -- some fields
  empno int not null,
  deptno int not null,
  constraint emp_dept_fk foreign key (empno, deptno)
      references empdept (empno, deptno)
)


Maar of dat helemaal doet wat je wil weet ik eigenlijk niet.
Pagina: 1