MYSQL:一列数据依赖于另一列数据

3

我需要创建一个表格,其中包含国家和城市两列。

如果我将国家设为“美国”,那么城市必须是“纽约”。如何强制执行这个约束条件

我尝试过了,但这也会影响其他行中的数据:

UPDATE table1 SET city = IF(country = "USA", 'New York', '');

同时,如果可能的话,应该在创建表时添加该约束。

你使用了哪种服务器端语言? - M Khalid Junaid
我使用MySQL,但不知道什么是服务器端语言。 - user8630652
请帮忙,各位。 - user8630652
2个回答

0
如果我们按照每次插入表后更新表的逻辑来进行,那么我们需要做的是:
UPDATE table1
SET city="new york"
WHERE country="usa";

在这里,WHERE子句将负责只选择具有 countryusa的元组。

设置约束条件最好的方法之一是使用CHECK,但不幸的是,如文档中微小的评论所述,CHECK约束被MySQL忽略:CREATE TABLE

CHECK子句由所有存储引擎解析,但都会被忽略。


在创建表的同时是否有任何方式可以强制执行这个约束条件? - user8630652
我不确定。让我检查一下。虽然使用其他服务器端语言可能是您唯一的选择。 - Kaushik NP
顺便说一句,感谢您的回答。如果您在创建表时找到了强制执行此约束的方法,那将非常有帮助。 - user8630652
@jamesgem,是的,如果您尝试在每次插入后都进行更新逻辑,则会出现冗余。 - Kaushik NP

0

你可以像这样处理表定义。

 CREATE TABLE table_name
(
   country varchar(30),
   state varchar(30),
   CONSTRAINT check_state 
   CHECK ( state =  CASE WHEN country ='usa' THEN 'new york' ELSE '' END )
        );

或者您可以在创建表后使用ADD CONSTRAINT添加约束。

根据@Tim的评论,添加触发器代码以实现相同的功能。

DELIMITER |

     CREATE  TRIGGER `update_state`
     AFTER INSERT ON `table_name` FOR EACH ROW
     BEGIN
     SET status = CASE WHEN new.country= 'usa' THEN 'New York' else '' 
     END;

DELIMITER ;

好的,但我相信目前没有任何版本的MySQL强制执行这样的约束。相反,您需要有创意,可能使用触发器。 - Tim Biegeleisen
@TimBiegeleisen 嗯..谢谢..我也添加了触发器的代码。 - jophab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接