如何为SQL的brands表新增带固定可选值的country列?
解决方案:为
brands表新增带可选值限制的country列 没问题,我来帮你搞定这个需求!要给新增的country列限定只能从指定的四个选项中取值,我们可以利用数据库的CHECK约束(或者针对MySQL旧版本用ENUM类型),下面分场景给出具体操作:
场景1:新增列的同时直接添加取值限制
如果还没新增country列,可以一步到位,在添加列的同时加上约束:
ALTER TABLE brands ADD COLUMN country VARCHAR(50), ADD CONSTRAINT chk_country CHECK (country IN ('Japan', 'New Zealand', 'US', 'France'));
- 这条语句先为表添加
country列,然后通过CHECK约束限定它的取值必须在你指定的四个国家范围内。 - 如果需要强制该列不能为空,只需在
VARCHAR(50)后面加上NOT NULL即可。
场景2:已经新增了country列,现在补加取值限制
如果你已经执行了新增列的操作,现在只需要单独添加约束:
ALTER TABLE brands ADD CONSTRAINT chk_country CHECK (country IN ('Japan', 'New Zealand', 'US', 'France'));
针对MySQL旧版本的替代方案(8.0.16之前)
MySQL在8.0.16版本之前,CHECK约束不会实际生效(只会被解析但不强制执行),这时候可以用ENUM类型来实现取值限制:
-- 新增列时直接用ENUM类型 ALTER TABLE brands ADD COLUMN country ENUM('Japan', 'New Zealand', 'US', 'France');
ENUM类型会直接把列的取值范围限定为你指定的选项,存储效率也更高,但缺点是后续要修改可选值的话,必须再次执行ALTER TABLE语句,灵活性不如CHECK约束。
验证约束是否生效
你可以尝试插入一个不在列表中的值(比如'Germany'),如果数据库返回报错,就说明约束已经正常工作了:
INSERT INTO brands (Brand, Contact, Address, Location, country) VALUES ('TestBrand', 'TestContact', 'TestAddr', 'TestLoc', 'Germany');
内容的提问来源于stack exchange,提问作者XaviorL
相关产品推荐
相关产品推荐

