sql >> Database >  >> RDS >> Mysql

Beperken met voorwaardelijke waardecontrole in MySQL

Volgens de documentatie ,

Dus het verwijderen van de not null -beperking van Status en het toevoegen van een unieke index op (ContactId,PhoneId,Status) zal werken zoals u het wilt, als u null . gebruikt in plaats van 0 voor inactief records.

Als u null niet wilt of kunt gebruiken voor uw Status kolom, wil zeker weten dat beide Status=0 en Status=null zich identiek gedragen, of b.v. wil Status=2 behandelen als actief (en het afdwingen van uniciteit), kunt u een dummy-kolom toevoegen die wordt berekend op basis van Status .

Als u MySQL 5.7+ gebruikt, kunt u dit doen met een gegenereerde kolom:

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 

Anders kunt u een normale kolom gebruiken en triggers gebruiken om de waarde van de kolom te berekenen, bijvoorbeeld:

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);

U kunt de formule natuurlijk omschakelen naar b.v. if(new.Status <> 0, new.Status, null); als u verschillende waarden van Status wilt toestaan te.




  1. NULL-waarden binnen de NOT IN-clausule

  2. Hoe dubbele records in de mysql-database te verwijderen?

  3. Retourneer de eerste maandag van elke maand in SQLite

  4. PHP en Postgres:fouten opvangen?