sql >> Database teknologi >  >> RDS >> Mysql

Håndhæv unikke værdier på tværs af to tabeller

Du kan ikke erklære en UNIK begrænsning på tværs af flere tabeller, og MySQL understøtter slet ikke CHECK-begrænsninger. Men du kan designe en trigger til at søge efter den matchende værdi i den anden tabel. Her er et test SQL-script:

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 har også brug for lignende triggere VED OPDATERING for hver tabel, men du burde ikke have brug for nogen udløsere VED SLETNING.



  1. MySQL Update Indre Join-tabeller forespørgsel

  2. Sådan formindskes/renses ibdata1-fil i MySQL

  3. Installer MySQL 5.6 på Ubuntu 20.04

  4. Escape SQL LIKE værdi for Postgres med psycopg2