MySQL表中的常量列值

时间:2016-06-19 06:02:50

标签: mysql sql

我在MySQL中有一个表。我想将表的列值设置为常量整数。我怎么能这样做?

4 个答案:

答案 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);