2010-09-23 17 views
12

¿Puede la misma columna tener la clave primaria & restricción de clave externa en otra columna?¿Puede la misma columna tener clave principal y restricción de clave externa en otra columna

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

¿Será esto un problema si intento eliminar los datos de la tabla1?

Delete from table1 where ID=1000; 

Gracias.

+0

Usted encontrará la respuesta en este enlace: [Puede una El atributo de base de datos debe ser primario y clave externa?] (http://stackoverflow.com/questions/9244432/can-a-database-attribute-be-primary-and-foreign-key) –

Respuesta

18

No debería haber ningún problema con eso. Consideremos el siguiente ejemplo:

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); 

Las tablas contienen ahora:

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) 

Ahora podemos eliminar correctamente las filas de esta manera:

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) 

Sin embargo, no será capaz de eliminar la siguiente:

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

Si hubiéramos definido la clave externa en table1 con la opción CASCADE, que habría sido capaz de eliminar al padre, y todos los niños se obtendría borrado automáticamente:

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); 

Si tuviéramos que repetir el que haya fallado anteriormente DELETE , las filas de los niños en table1 serán eliminados, así como la fila de los padres en 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

Corrígeme si me equivoco, pero No veo cómo esto responde la pregunta. (Y por qué se ha aceptado.) La pregunta es si podemos tener la misma columna con la clave principal y la restricción de la clave externa en otra columna. La respuesta aceptada introduce una segunda columna (t2_id) como una clave externa, no muestra una columna que sea clave principal y clave externa. –

+4

Y pensé que encontraría la respuesta aquí: / – Saleem

0

Sí, se puede.

No, no lo hará.

P.S. Pero no podrá borrar los datos de la tabla 2 sin borrar las filas correspondientes de la tabla1 obviamente.

P.P.S. Implementé dicha estructura en Postgres, pero debe ser similar para MySQL.

3

----- Asignación de clave principal y clave externa a la misma columna en una tabla --------

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) 
Cuestiones relacionadas