2010-09-23 12 views
12

Czy ta sama kolumna może zawierać klucz obcy & dla innego klucza?Czy ta sama kolumna ma ograniczenie klucza podstawowego i klucza obcego do innej kolumny

Table1: ID - Primary column, foreign key constraint for Table2 ID 
Table2: ID - Primary column, Name 

Czy to będzie problem, jeśli spróbuję usunąć dane table1?

Delete from table1 where ID=1000; 

Dzięki.

+0

Będziesz znaleźć odpowiedź do tego linku: [Czy atrybut bazy danych jest kluczem podstawowym i obcym?] (http://stackoverflow.com/questions/9244432/can-a-database-attribute-be-primary-and-foreign-key) –

Odpowiedz

18

Nie powinno być z tym problemu. Rozważmy następujący przykład:

CREATE TABLE table2 (
    id int PRIMARY KEY, 
    name varchar(20) 
) ENGINE=INNODB; 

CREATE TABLE table1 (
    id int PRIMARY KEY, 
    t2_id int, 
    FOREIGN KEY (t2_id) REFERENCES table2 (id) 
) ENGINE=INNODB; 

INSERT INTO table2 VALUES (1, 'First Row'); 
INSERT INTO table2 VALUES (2, 'Second Row'); 

INSERT INTO table1 VALUES (1, 1); 
INSERT INTO table1 VALUES (2, 1); 
INSERT INTO table1 VALUES (3, 1); 
INSERT INTO table1 VALUES (4, 2); 

tabele zawierają teraz:

SELECT * FROM table1; 
+----+-------+ 
| id | t2_id | 
+----+-------+ 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
+----+-------+ 
4 rows in set (0.00 sec) 

SELECT * FROM table2; 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 1 | First Row | 
| 2 | Second Row | 
+----+------------+ 
2 rows in set (0.00 sec) 

Teraz możemy skutecznie usuwać wiersze tak:

DELETE FROM table1 WHERE id = 1; 
Query OK, 1 row affected (0.00 sec) 

DELETE FROM table1 WHERE t2_id = 2; 
Query OK, 1 row affected (0.00 sec) 

jednak nie będziemy w stanie usunąć następujące:

DELETE FROM table2 WHERE id = 1; 
ERROR 1451 (23000): A foreign key constraint fails 

Gdybyśmy zdefiniowany klucz obcy na table1 z opcją CASCADE, bylibyśmy w stanie usunąć rodzica, a wszystkie dzieci będą się automatycznie usunięte:

CREATE TABLE table2 (
    id int PRIMARY KEY, 
    name varchar(20) 
) ENGINE=INNODB; 

CREATE TABLE table1 (
    id int PRIMARY KEY, 
    t2_id int, 
    FOREIGN KEY (t2_id) REFERENCES table2 (id) ON DELETE CASCADE 
) ENGINE=INNODB; 

INSERT INTO table2 VALUES (1, 'First Row'); 
INSERT INTO table2 VALUES (2, 'Second Row'); 

INSERT INTO table1 VALUES (1, 1); 
INSERT INTO table1 VALUES (2, 1); 
INSERT INTO table1 VALUES (3, 1); 
INSERT INTO table1 VALUES (4, 2); 

Gdybyśmy powtórzyć poprzednio udało DELETE , dzieci wiersze table1 zostaną usunięte, jak również szeregu dominującej w table2:

DELETE FROM table2 WHERE id = 1; 
Query OK, 1 row affected (0.00 sec) 

SELECT * FROM table1; 
+----+-------+ 
| id | t2_id | 
+----+-------+ 
| 4 |  2 | 
+----+-------+ 
1 row in set (0.00 sec) 

SELECT * FROM table2; 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 2 | Second Row | 
+----+------------+ 
1 row in set (0.00 sec) 
+23

Proszę mnie poprawić, jeśli się mylę, ale Nie rozumiem, jak to odpowiada na pytanie. (I dlaczego została przyjęta.) Pytanie brzmi, czy możemy mieć tę samą kolumnę, która ma klucz podstawowy i klucz obcy dla innej kolumny. Przyjęta odpowiedź wprowadza drugą kolumnę (t2_id) jako klucz obcy, nie pokazuje kolumny, która jest zarówno kluczem podstawowym, jak i kluczem obcym. –

+4

I pomyślałem, że znajdę odpowiedź tutaj: / – Saleem

0

Tak, może.

Nie, nie będzie.

P.S. Ale nie będziesz w stanie usunąć danych table2 bez usuwania oczywiście odpowiednich wierszy table1.

P.P.S. Zaimplementowałem taką strukturę w Postgresie, ale musi ona być podobna do MySQL.

3

----- Przypisywanie Klucz główny A Klucz obcy do tej samej kolumny w tabeli --------

create table a1 
(
id1 int not null primary key 
) 

insert into a1 values(1),(2),(3),(4) 


create table a2 
(
id1 int not null primary key foreign key references a1(id1) 

) 
insert into a2 values(1),(2),(3) 
Powiązane problemy