Check y Foreign Keys en MySQL5
Soy experto en BBDD pero estoy empezando con MySQL5, antes de preguntar he leído y releído el manual de referencia y diversos manuales, pero nada:
1.- Creo que MySQL acepta la sintaxis de los CHECKs de columna y tabla por compatibilidad pero los ignora (ni siquiera los almacena). ¿Puedes confirmarme esto? ¿Es cierto?, entonces ¿cómo pongorestricciones de rechazo en mis tablas?.
2.- No consigo que se tragué las restricciones Foreign Key en mis tablas, lo he probado todo: en columna, al final del CREATE, con nombre, sin nombre, añadiéndola con ALTER TABLE,... La sintaxis es correcta, pero si la incluyo en la columna se la traga pero ignorándola (no la almacena). Si la pongo al final del CREATE TABLE o la añado con ALTER TABLE da error 1005, es rarísimo.
Por supuesto las tablas son InnoDB y mi SQL tiene las variables habilitadas, pero no hay manera:
SHOW VARIABLES LIKE '%innodb%';
have_innodb YES
innodb_additional_mem_pool_size 1048576
innodb_buffer_pool_size 8388608
innodb_buffer_pool_awe_mem_mb 0
innodb_data_file_path ibdata1:10M:autoextend
innodb_data_home_dir
innodb_file_io_threads 4
innodb_open_files 300
innodb_force_recovery 0
innodb_thread_concurrency 8
innodb_flush_log_at_trx_commit 1
innodb_fast_shutdown ON
innodb_file_per_table OFF
innodb_flush_method
innodb_lock_wait_timeout 50
innodb_log_arch_dir .\
innodb_log_archive OFF
innodb_log_buffer_size 1048576
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_log_group_home_dir .\
innodb_mirrored_log_groups 1
innodb_max_dirty_pages_pct 90
Ejemplo de mis tablas:
DROP TABLE IF EXISTS POLICIAS;
CREATE TABLE IF NOT EXISTS POLICIAS
( dni SMALLINT PRIMARY KEY,
nombre VARCHAR(20) NOT NULL,
categoria ENUM('POLICIA','CABO','SARGENTO','INSPECTOR','INTENDENTE') DEFAULT 'POLICIA' NOT NULL,
funcion ENUM('TRAFICO','CRIMEN','ESCOLTA','INTERNO','ADMINISTRACION')
not null,
jefe smallint references policías on update cascade,
constraint ck_dnis check (dni between 0 and 9999)
) ENGINE=INNODB;
# Si pongo la FK como restriccion de columna, se crea la tabla pero no la FK. Si se pone como restrc. De tabla da error 1005 y no la crea.???
DROP TABLE IF EXISTS ARMAS;
CREATE TABLE ARMAS
( Cod CHAR(5) PRIMARY KEY,
nombre VARCHAR(15) NOT NULL,
clase TINYINT NOT NULL,
poli SMALLINT REFERENCES POLICIAS
ON DELETE SET NULL ON UPDATE CASCADE,
nota TINYINT,
CONSTRAINT CK_cod_Arma CHECK (cod RLIKE '[A-Z][0-9][0-9][0-9][0-9]'),
#No se crean los CHECKs ????
CONSTRAINT CK_Clase_Arma CHECK (clase BETWEEN 1 AND 5),
CONSTRAINT CK_Nota_Arma CHECK (nota BETWEEN 1 AND 10)
) ENGINE=INNODB;
3.- Por cierto ¿funcionaria ese CHECK con RLIKE?
Tiene que haber algún problema en my configuración MYSQL (he probado con el QUerry visual, comandos MS-DOS y PHPMyadmin). Si me sacas de dudas eres un genio.
1.- Creo que MySQL acepta la sintaxis de los CHECKs de columna y tabla por compatibilidad pero los ignora (ni siquiera los almacena). ¿Puedes confirmarme esto? ¿Es cierto?, entonces ¿cómo pongorestricciones de rechazo en mis tablas?.
2.- No consigo que se tragué las restricciones Foreign Key en mis tablas, lo he probado todo: en columna, al final del CREATE, con nombre, sin nombre, añadiéndola con ALTER TABLE,... La sintaxis es correcta, pero si la incluyo en la columna se la traga pero ignorándola (no la almacena). Si la pongo al final del CREATE TABLE o la añado con ALTER TABLE da error 1005, es rarísimo.
Por supuesto las tablas son InnoDB y mi SQL tiene las variables habilitadas, pero no hay manera:
SHOW VARIABLES LIKE '%innodb%';
have_innodb YES
innodb_additional_mem_pool_size 1048576
innodb_buffer_pool_size 8388608
innodb_buffer_pool_awe_mem_mb 0
innodb_data_file_path ibdata1:10M:autoextend
innodb_data_home_dir
innodb_file_io_threads 4
innodb_open_files 300
innodb_force_recovery 0
innodb_thread_concurrency 8
innodb_flush_log_at_trx_commit 1
innodb_fast_shutdown ON
innodb_file_per_table OFF
innodb_flush_method
innodb_lock_wait_timeout 50
innodb_log_arch_dir .\
innodb_log_archive OFF
innodb_log_buffer_size 1048576
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_log_group_home_dir .\
innodb_mirrored_log_groups 1
innodb_max_dirty_pages_pct 90
Ejemplo de mis tablas:
DROP TABLE IF EXISTS POLICIAS;
CREATE TABLE IF NOT EXISTS POLICIAS
( dni SMALLINT PRIMARY KEY,
nombre VARCHAR(20) NOT NULL,
categoria ENUM('POLICIA','CABO','SARGENTO','INSPECTOR','INTENDENTE') DEFAULT 'POLICIA' NOT NULL,
funcion ENUM('TRAFICO','CRIMEN','ESCOLTA','INTERNO','ADMINISTRACION')
not null,
jefe smallint references policías on update cascade,
constraint ck_dnis check (dni between 0 and 9999)
) ENGINE=INNODB;
# Si pongo la FK como restriccion de columna, se crea la tabla pero no la FK. Si se pone como restrc. De tabla da error 1005 y no la crea.???
DROP TABLE IF EXISTS ARMAS;
CREATE TABLE ARMAS
( Cod CHAR(5) PRIMARY KEY,
nombre VARCHAR(15) NOT NULL,
clase TINYINT NOT NULL,
poli SMALLINT REFERENCES POLICIAS
ON DELETE SET NULL ON UPDATE CASCADE,
nota TINYINT,
CONSTRAINT CK_cod_Arma CHECK (cod RLIKE '[A-Z][0-9][0-9][0-9][0-9]'),
#No se crean los CHECKs ????
CONSTRAINT CK_Clase_Arma CHECK (clase BETWEEN 1 AND 5),
CONSTRAINT CK_Nota_Arma CHECK (nota BETWEEN 1 AND 10)
) ENGINE=INNODB;
3.- Por cierto ¿funcionaria ese CHECK con RLIKE?
Tiene que haber algún problema en my configuración MYSQL (he probado con el QUerry visual, comandos MS-DOS y PHPMyadmin). Si me sacas de dudas eres un genio.
1 Respuesta
Respuesta
1