2011-02-23 213 views
31

Estoy aprendiendo SQL y lo que me molesta es que parezco incapaz de encontrar TODAS las restricciones en una tabla. He creado la mesa conMySQL: ¿cómo puedo ver TODAS las restricciones en una tabla?

create table t2 
(a integer not null primary key, 
b integer not null, constraint c1 check(b>0), 
constraint fk1 foreign key(a) references t1(a)); 

y añadió una restricción con

alter table t2 
add constraint c2 check (b<20); 

Luego trató de ver todos (cuatro) restricciones con

show table status 
from tenn #-->the name of my database 
like 't2'; 

y luego

show create table t2; 

y luego

select * 
from information_schema.key_column_usage 
where table_name='t2'; 

y finalmente

select * 
from information_schema.table_constraints 
where table_name='t2'; 

Sin embargo, ninguno de estos programas las cuatro limitaciones. ¿Alguien podría decirme cómo verlos a todos?

¡Muchas gracias!

+1

¿Podría especificar cuál es el resultado de las consultas que ejecuta? * P.S Lo que he escuchado es que mysql no admite restricciones de verificación. – user194076

+0

¿Aunque has probado CONSTRAINT_COLUMN_USAGE? – user194076

+0

Puede intentar consultar las tablas del sistema directamente, no vistas del esquema de información – user194076

Respuesta

18

MySQL no comprueba las restricciones. El SQL se analiza, se acepta y luego se ignora silenciosamente sin ningún mensaje para el usuario.

Como la restricción de verificación no se crea, no la verá.

3

Las restricciones de clave externa se enumeran en la columna Comentario de la salida del siguiente comando:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'; 
+0

Esto no funcionó para mí (mysql 5.5.35-0ubuntu0.12.04.2): el campo de comentarios está en blanco, mientras que la solución de RR Madhav muestra restricciones devueltas como columnas. – msanford

10

Se puede utilizar esta:

select 
    table_name,column_name,referenced_table_name,referenced_column_name 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 

o para el uso mejor salida con formato siguiente:

select 
    concat(table_name, '.', column_name) as 'foreign key', 
    concat(referenced_table_name, '.', referenced_column_name) as 'references' 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 
45
select COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_COLUMN_NAME, REFERENCED_TABLE_NAME 
from information_schema.KEY_COLUMN_USAGE 
where TABLE_NAME = 'table to be checked'; 
+0

Una solución agradable, limpia y mínima. –

3

Se puede usar un information_schema.table_constraints Seleccione de la siguiente manera:

mysql> select * from information_schema.table_constraints 
-> where table_schema = schema() 
-> and table_name = 'table_name'; 
0

Exportar la tabla de base de datos en SQL.

Si tiene phpmyadmin, puede hacerlo visitando la pestaña "Exportar". Si elige el método de exportación "Personalizado", asegúrese de seleccionar "estructura" o "estructura y datos" en la sección "Opciones específicas de formato".

Muestra .sql fragmento de exportación:

-- 
-- Table structure for table `customers` 
--  

CREATE TABLE `customers` (
    `username` varchar(50) NOT NULL, 
    `fullname` varchar(100) NOT NULL, 
    `postalcode` varchar(50) NOT NULL, 
    PRIMARY KEY (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
... 
13

La forma más sencilla de ver la explicación de una tabla actual y sus limitaciones es utilizar:

SHOW CREATE TABLE mytable;

Esto le mostrará exactamente lo SQL se ingresaría para definir la estructura de la tabla en su forma actual.

1

Desafortunadamente, MySQL no admite restricciones de comprobación de SQL.Cuando los defines en tu consulta, simplemente se ignoran.

Cuestiones relacionadas