sql >> Databasteknik >  >> RDS >> Mysql

Framtvinga unika värden över två tabeller

Du kan inte deklarera en UNIK begränsning över flera tabeller, och MySQL stöder inte CHECK-begränsningar alls. Men du kan designa en utlösare för att söka efter det matchande värdet i den andra tabellen. Här är ett test-SQL-skript:

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

Du behöver också liknande triggers VID UPPDATERING för varje tabell, men du borde inte behöva några triggers ON DELETE.



  1. UPPDATERAD:Bugg orsakar att Microsoft Office 365 Build 2105 bryter åtkomstapplikationer

  2. Hur kan jag kontrollera om mysql-tabellkolumnen ens existerar?

  3. Välj separata rader från två tabeller, sortera efter datum

  4. Hur RandomBlob() fungerar i SQLite