如何编辑对已经定义并填写在mysql中的行的限制
Posted
技术标签:
【中文标题】如何编辑对已经定义并填写在mysql中的行的限制【英文标题】:How to edit restriction on rows that are already defined and filled in mysql 【发布时间】:2022-01-13 02:27:27 【问题描述】:我有一个表名 temp,其中有数据类型为 INT 的 x 列。
mysql> desc temp;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| x | int | YES | | NULL | |
+-------+------+------+-----+---------+-------+
如下图我已经在列中插入了值。
mysql> select * from temp;
+------+
| x |
+------+
| 10 |
+------+
是否可以对已定义的 x 列设置限制,使其只接受值小于 10 的整数。
注意:我不打算创建新列,而是对已创建的列添加限制
【问题讨论】:
如果您想将限制添加为 CHECK 约束,那么您必须事先编辑数据 - 每行的数据必须匹配,如果不匹配,则添加约束将失败。如果您只想将此限制添加到新插入/更新的行并保存不匹配的现有值,则可以根据 BEFORE INSERT/UPDATE 触发器使用。 【参考方案1】:是的,您可以将约束添加到已定义和填充的列。正如@Akina 在 cmets 中指出的那样,要将限制添加为CHECK
约束,您需要更新先前填充的数据以匹配新约束。这样做是为了确保新应用的约束不会失败。
更新数据后,您可以应用CHECK
约束,如下所示:
ALTER TABLE temp
ADD CHECK (x <= 10);
【讨论】:
【参考方案2】:是否可以对已定义的 x 列设置限制,使其只接受值小于 10 的整数。
是的。在我看来,您可以创建一个触发器来设置限制(在您的情况下 x
CREATE TRIGGER check_trigger
BEFORE INSERT
ON tmp
FOR EACH ROW
BEGIN
IF NEW.x >= 10 THEN
CALL `Error: Wrong values for field x. x must be less than 10`; -- this trick will throw an error
END IF;
END ;
使用此触发器,我在尝试使用 x = 11 创建记录时出错 image for more details 您可能需要为更新再创建一个触发器
【讨论】:
此CALL
用法会产生 SQL 语法错误,而不是检查错误。 CALL Statement。您必须使用 SIGNAL 语句。以上是关于如何编辑对已经定义并填写在mysql中的行的限制的主要内容,如果未能解决你的问题,请参考以下文章
用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用