为sql中的列设置唯一约束

Posted

技术标签:

【中文标题】为sql中的列设置唯一约束【英文标题】:set unique constraint for a column in sql 【发布时间】:2021-04-10 00:26:20 【问题描述】:

我有一个 sql 表,我在一列中存储了一个 json 编码值。现在我想为该列的一个值设置唯一约束。有可能吗?

@AlexCollette 
select version(); 
5.7.32-cll-lve

 CREATE TABLE `sale` (
 `sale_id` int(11) NOT NULL AUTO_INCREMENT,
 `sale_code` longtext,
 `buyer` longtext,
 `guest_id` varchar(100) DEFAULT NULL,
 `product_details` longtext,
 `shipping_address` longtext,
 `vat` longtext,
 `vat_percent` varchar(10) DEFAULT NULL,
 `shipping` longtext,
 `payment_type` varchar(100) DEFAULT NULL,
 `payment_status` longtext,
 `payment_details` longtext,
 `payment_timestamp` longtext,
 `grand_total` longtext,
 `sale_datetime` longtext,
 `delivary_datetime` longtext,
 `delivery_status` longtext,
 `viewed` longtext,
 `verify_payment_details` longtext NOT NULL,
 PRIMARY KEY (`sale_id`)
) ENGINE=MyISAM AUTO_INCREMENT=344 DEFAULT CHARSET=utf8

【问题讨论】:

您能否进一步详细说明:“现在我想为该列的其中一个值设置唯一约束” json 值是否始终具有相同的格式? 不完全是,如果您使用的 JSON 不是数据库中的本机数据类型,那么对它们设置任何约束都不是明智之举。但我确实缺乏这种问题的经验。 select version(); 显示什么?说出你想要的实际约束是什么。显示show create table yourmysterytablename 的输出(请作为文本,而不是图像) 您可能希望重新设计该表架构并将该特定值 (mihpayid) 考虑为单独的列 - 您不能仅通过每条记录中的一小段数据将列设置为唯一。 【参考方案1】:

您没有指定值是什么。在旧版本的 mysql 中,您不能直接在 JSON 上创建索引。但是,您可以创建一个生成的列并使用它:

alter table sale add column mihpayid text generated always as
    (payment_details ->> '$.mihpayid') stored;

create unique index unq_sale_mihpayid on sale(mihpayid);

【讨论】:

以上是关于为sql中的列设置唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

SQL中Unique约束有啥用啊?

sqlserver表的唯一键约束怎么设置?

唯一约束

SQL - 添加唯一约束失败

mysql唯一约束

跨多个表的列的 SQL 唯一约束