如何为SQL products表添加约束:p_name以Smoked salmon开头时p_id需以SS开头
解决CHECK约束逻辑错误的问题
你之前写的约束逻辑有误,它强制要求所有记录必须同时满足p_id LIKE 'SS%'和p_name LIKE 'Smoked salmon%',但表中存在其他类型的商品记录,自然无法生效。
正确的逻辑应该是:仅当p_name以Smoked salmon开头时,p_id必须以SS开头,其他商品的p_id和p_name不受限制。在SQL中,这种"如果A则B"的逻辑等价于非A 或者 B,对应的约束语句如下:
如果是给已存在的products表添加约束,执行这条语句:
ALTER TABLE products ADD CONSTRAINT my_constraint CHECK (p_name NOT LIKE 'Smoked salmon%' OR p_id LIKE 'SS%');
如果是新建表时直接定义约束:
CREATE TABLE products ( p_id VARCHAR(10), p_name VARCHAR(50), CONSTRAINT my_constraint CHECK (p_name NOT LIKE 'Smoked salmon%' OR p_id LIKE 'SS%') );
你的现有数据完全符合这条约束的要求:所有以Smoked salmon开头的商品,p_id都是SS开头;其他商品的组合不受约束,因此可以成功添加这条规则。
内容的提问来源于stack exchange,提问作者Sharpe
相关产品推荐
相关产品推荐

