2011-01-12 12 views
1

Die zusammengesetzten Fremdschlüsselindizes funktionieren nicht so, wie ich dachte. Im folgenden Beispiel möchte ich nur die 10 Kombinationen in der untergeordneten Tabelle erlaubt sein. Die letzte INSERT-Anweisung ist jedoch erfolgreich, auch wenn in der übergeordneten Tabelle keine passende Kombination vorhanden ist. Gibt es eine andere Möglichkeit, diese Art von Einschränkung zu erreichen?Zusammengesetzte Fremdschlüsseleinschränkung

drop table if exists child; 
drop table if exists parent; 

CREATE TABLE parent(
`ID` int(11) default NULL, 
`name` varchar(100) default NULL, 
`city` varchar(100) default NULL, 
key (name,city), 
key (ID) 
) ENGINE=InnoDB; 

create table child(
userID int not null, 
`name` varchar(100) default NULL, 
`city` varchar(100) default NULL, 
key (name,city), 
FOREIGN KEY (name,city) REFERENCES parent(name,city), 
primary key (userID) 
) ENGINE=InnoDB; 

insert into parent values (1, 'Amar', 'mumbai'); 
insert into parent values (2, 'Amar', 'Delhi'); 
insert into parent values (3, 'Amar', NULL); 
insert into parent values (4, 'Akbar', 'mumbai'); 
insert into parent values (5, 'Akbar', 'Delhi'); 
insert into parent values (6, 'Akbar', NULL); 
insert into parent values (7, 'Anthony', 'mumbai'); 
insert into parent values (8, 'Anthony', 'Delhi'); 
insert into parent values (9, 'Anthony', NULL); 
insert into parent values (10, NULL, NULL); 

insert into child values (2, NULL, 'mumbai'); 

Antwort

1

den Laut documentation

Die Klausel MATCH in dem SQL-Standard steuert, wie NULL-Werte in einem zusammengesetzten (Mehrfach- Spalte) Fremdschlüssel behandelt werden, wenn zu ein Primärschlüssel vergleicht. InnoDB implementiert im Wesentlichen die von MATCH SIMPLE definierte Semantik, die es einem Fremdschlüssel erlaubt, ganz oder teilweise NULL zu sein. In diesem Fall darf die Zeile (untergeordnete Tabelle), die einen solchen Fremdschlüssel enthält, eingefügt werden und entspricht keiner Zeile in der referenzierten Tabelle (übergeordnet). Es ist möglich, andere Semantiken unter Verwendung von Triggern zu implementieren.

0

da das child.name-Feld als nullwert deklariert ist und Nullwerte enthalten kann. Es verletzt nicht das Fremdschlüsselkonzept. Die Lösung besteht darin, fk-Felder als NOT NULL zu dekomprimieren

5

Verwenden Sie keine Nullen in Fremdschlüsselspalten; dieser Weg führt zur dunklen Seite. Sie sollten solche Spalten deklarieren NOT NULL.

Verwandte Themen