mysql - varias - Aplicar valores únicos en dos tablas
sql distinct varias columnas (7)
¿Es posible imponer la singularidad en dos tablas en MySQL?
Tengo dos tablas, ambas describiendo usuarios. Los usuarios de estas tablas eran para dos sistemas diferentes anteriormente, sin embargo ahora estamos fusionando nuestros sistemas de autenticación y necesito asegurarme de que haya nombres de usuario únicos en estas dos tablas. (es demasiado trabajo ponerlos todos en una mesa en este momento).
¿Sería asequible cambiar el tipo de columna de ID? Luego, puede elegir GUID que sean únicos en todas las tablas que desee.
No conozco MySQL, pero esta es la forma en que puede hacerlo en Oracle y creo que MySQL también admite vistas materializadas.
Usted crea una vista materializada en esas dos tablas. Y agrega una restricción única en esta vista.
Esta vista debe actualizarse cada vez que se confirma un cambio en una de las dos tablas base.
No puede declarar una restricción ÚNICA en múltiples tablas, y MySQL no admite restricciones CHECK en absoluto. Pero puede diseñar un disparador para buscar el valor coincidente en la otra tabla. Aquí hay un script SQL de prueba:
DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (username VARCHAR(10) NOT NULL);
DROP TABLE IF EXISTS bar;
CREATE TABLE BAR (username VARCHAR(10) NOT NULL);
DROP TRIGGER IF EXISTS unique_foo;
DROP TRIGGER IF EXISTS unique_bar;
DELIMITER //
CREATE TRIGGER unique_foo BEFORE INSERT ON foo
FOR EACH ROW BEGIN
DECLARE c INT;
SELECT COUNT(*) INTO c FROM bar WHERE username = NEW.username;
IF (c > 0) THEN
-- abort insert, because foo.username should be NOT NULL
SET NEW.username = NULL;
END IF;
END//
CREATE TRIGGER unique_bar BEFORE INSERT ON bar
FOR EACH ROW BEGIN
DECLARE c INT;
SELECT COUNT(*) INTO c FROM foo WHERE username = NEW.username;
IF (c > 0) THEN
-- abort insert, because bar.username should be NOT NULL
SET NEW.username = NULL;
END IF;
END//
DELIMITER ;
INSERT INTO foo VALUES (''bill''); -- OK
INSERT INTO bar VALUES (''bill''); -- Column ''username'' cannot be null
También necesita activadores similares ON ACTUALIZAR para cada tabla, pero no debería necesitar ningún activador ON DELETE.
Obviamente, si ya hay duplicados en las dos tablas, tendrás que resolver ese problema a mano. En el futuro, podría escribir un disparador que verifique ambas tablas para ver si el valor ya existe y luego aplicarlo a ambas tablas.
Puede agregar una tabla adicional con una sola columna como clave principal. Luego, crea un activador en cada una de tus tablas de usuarios anteriores para insertar el ID en esta tabla adicional.
create table users1 (
user_id integer primary key,
username varchar(8) not null unique
);
create table users2 (
user_id integer primary key,
username varchar(8) not null unique
);
create table all_usernames (
username varchar(8) primary key
);
create trigger users1_insert before insert on users1 for each row
insert into all_usernames values(new.username);
create trigger users2_insert before insert on users2 for each row
insert into all_usernames values(new.username);
create trigger users1_update before update on users1 for each row
update all_usernames set username = new.username
where username = old.username;
create trigger users2_update before update on users2 for each row
update all_usernames set username = new.username
where username = old.username;
create trigger users1_delete before delete on users1 for each row
delete from all_usernames where username = old.username;
create trigger users2_delete before delete on users2 for each row
delete from all_usernames where username = old.username;
Puede llenar la tabla con
insert into all_usernames select username from users1;
insert into all_usernames select username from users2;
la mejor manera de hacerlo es declarar otra tabla con las columnas únicas, y hacer que las tablas múltiples hagan referencia a estas tablas
Tal vez no sea una respuesta directa a su pregunta, pero:
Debería considerar reescribir su código y reestructurar su base de datos para unir esas dos tablas en una sola.
El diseño que está tratando de hacer cumplir ahora complicará su código y el esquema de la base de datos y dificultará cualquier actualización adicional a otro software de base de datos o marcos.