我在MySQL中有一个表。我想将表的列值设置为常量整数。我怎么能这样做?
答案 0 :(得分:5)
不幸的是,MySQL不支持SQL检查约束。您可以 为了兼容性原因,在DDL查询中定义它们,但它们是 只是被忽略了您可以创建BEFORE INSERT和BEFORE UPDATE触发器 导致错误或将字段设置为其默认值时 不符合数据要求。
所以在这里你可以找到解决方法MYSQL TRIGGER
。
样本表:
DROP TABLE IF EXISTS `constantvaluetable`;
CREATE TABLE `constantvaluetable` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`constValue` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB;
<强>触发:强>
DROP TRIGGER IF EXISTS trigger_const_check;
delimiter //
CREATE TRIGGER trigger_const_check BEFORE INSERT ON constantvaluetable
FOR EACH ROW
BEGIN
IF NEW.constValue <> 71 THEN
SIGNAL SQLSTATE '45000' SET message_text ='Only allowed value is 71';
END IF;
END //
delimiter ;
<强>测试强>
INSERT INTO constantvaluetable(constValue) VALUES(71);
INSERT INTO constantvaluetable(constValue) VALUES(66);
结果:
第一个插入语句将成功。
第二个插入语句将失败。并将显示以下错误消息:
[Err] 1644 - 仅允许值为71
注意:假设您的常数值为71
。
答案 1 :(得分:1)
你真的想这样做吗?
以下是不够的
Select Field1, field2, field3 , 5 as `ConstantField` from myTable
答案 2 :(得分:0)
设置时,只需在表格中设置CHECK
约束即可。大多数DBMS都需要这样的东西
CREATE someTable
(
someValue int(4) CHECK (someValue = 4)
)
但是,对于MySQL,CHECK约束的行为与其他DBMS中的行为不同。情况有点棘手。答案似乎在这里:https://stackoverflow.com/a/14248038/5386243
答案 3 :(得分:0)
虽然71的触发器解决方案是通用方法,但由于它可用于更复杂的条件,在您只想检查常量值的情况下,您可以更接近数据库逻辑并添加表中只包含一个允许值的表的外键,例如
create table tbl_checkconst (constraintvalue int primary key);
insert into tbl_checkconst values (71);
alter table yourtable
add constraint fk_yourtable_constcheck
foreign key (column1)
references tbl_chechconst (constraintvalue);
它实际上会增加一些开销(因为它需要添加一个索引),但是会在数据库逻辑中表达你的约束,而你的常量通常具有以这种方式设计到数据库模型中的含义(尽管它是现在只有1个值),而您(以及具有正确权限的任何用户)可以通过将其添加到tbl_checkconst
- 表而轻松添加更多允许值,而无需修改触发器代码。
我添加它的另一个原因是我猜你实际上是在寻找一个外键:在你的一条评论中,你说你正试图创建一个&#34;双重外键到参考表&#34; 。如果我理解正确,您可能希望使用复合外键,因为您可以组合foreign key
的列:
alter table yourtable
add constraint fk_yourtable_col1col2
foreign key (column1, column2)
references your_reference_table (refcolumn1, refcolumn2);