gpt4 book ai didi

mysql - 在 MySQL 中使用条件值检查进行约束

转载 作者:行者123 更新时间:2023-11-28 23:13:36 25 4
gpt4 key购买 nike

我需要添加一个基于组合和值的约束检查

我的表结构是

CREATE TABLE IF NOT EXISTS `ContactPhone` (
`ContactPhoneId` int(10) unsigned NOT NULL,
`ContactId` int(11) NOT NULL,
`PhoneId` smallint(5) unsigned NOT NULL,
`Status` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `ContactPhone`
--
ALTER TABLE `ContactPhone`
ADD PRIMARY KEY (`ContactPhoneId`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `ContactPhone`
--
ALTER TABLE `ContactPhone`
MODIFY `ContactPhoneId` int(10) unsigned NOT NULL
AUTO_INCREMENT,AUTO_INCREMENT=1;

我需要确保记录基于以下组合条件约束

  • ContactId
  • 电话号码
  • Status == 1(值应该是 1 - Active Record)

注意:不需要非事件记录(即 Status == 0)。我只需要对 Active Records 进行此约束。

请帮助我如何为上面提到的 MySQL 表添加这个约束。

最佳答案

根据documentation ,

A UNIQUE index permits multiple NULL values for columns that can contain NULL.

所以删除 not null -来自 Status 的约束并在 (ContactId,PhoneId,Status) 上添加唯一索引如果您使用 null 将按照您的意愿工作而不是 0对于不活跃记录。

如果您不想或不能使用 null为你的Status列,要确保两者 Status=0Status=null行为相同,或者例如想治疗Status=2作为 active(并强制执行唯一性),您可以添加一个虚拟列,该列将从 Status 计算得出.

如果您使用的是 MySQL 5.7+,则可以使用生成的列执行此操作:

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

否则,您可以使用普通列并使用触发器来计算该列的值,例如:

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

您当然可以将公式切换为例如if(new.Status <> 0, new.Status, null);如果你想允许 Status 的不同值也。

关于mysql - 在 MySQL 中使用条件值检查进行约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com