sql >> Databáze >  >> RDS >> Mysql

Omezení s podmíněnou kontrolou hodnoty v MySQL

Podle dokumentace ,

Takže odstranění not null -omezení z Status a přidání jedinečného indexu na (ContactId,PhoneId,Status) bude fungovat tak, jak chcete, pokud použijete null místo 0 pro neaktivní záznamy.

Pokud nechcete nebo nemůžete použít null pro váš Status sloupec, chcete se ujistit, že oba Status=0 a Status=null chovat se stejně, nebo např. chcete ošetřit Status=2 jako aktivní (a vynucení jedinečnosti) také můžete přidat fiktivní sloupec, který bude vypočítán z Status .

Pokud používáte MySQL 5.7+, můžete to provést pomocí vygenerovaného sloupce:

CREATE TABLE IF NOT EXISTS `ContactPhone` (
  `ContactPhoneId` int(10) unsigned NOT NULL auto_increment primary key,
  `ContactId` int(11) NOT NULL,
  `PhoneId` smallint(5) unsigned NOT NULL,
  `Status` tinyint(1) NOT NULL DEFAULT '1',
  `StatusUnq` tinyint(1) as (if(Status <> 0, 1, null)) stored null,
  constraint unique (ContactId, PhoneId, StatusUnq)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (1, 1, 1, 1);
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (2, 1, 1, 1);
-- Duplicate key error 
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (3, 1, 1, 0);
insert into ContactPhone (ContactPhoneId, ContactId, PhoneId, Status)
values (4, 1, 1, 0);
update ContactPhone set Status = 1 where ContactPhoneId = 4;
-- Duplicate key error 

Jinak můžete použít normální sloupec a pomocí spouštěčů vypočítat hodnotu sloupce, např.:

create trigger trbi_contactPhoneUnique before insert on ContactPhone 
for each row
  set new.StatusUnq = if(new.Status <> 0, 1, null);

create trigger trbu_contactPhoneUnique before update on ContactPhone 
for each row
  set new.StatusUnq = if(new.Status <> 0, 1, null);

Vzorec můžete samozřejmě přepnout např. if(new.Status <> 0, new.Status, null); pokud chcete povolit různé hodnoty Status také.




  1. Náhodná chyba:#1045 Nelze se přihlásit k serveru MySQL

  2. Funkce PHP pro únik ze syntaxe regulárního výrazu MySQL

  3. Škálování připojení v PostgreSQL pomocí sdružování připojení

  4. Jak přejmenovat databázi MySQL