如何编辑对已经定义并填写在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中的行的限制的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 3:如何根据行中的值对不同的行定义不同的操作?

如何显示要编辑的特定行的注释?

用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用

如何在 if 语句中显示/比较 mysql 行的动态值?

如何使用填充旧表中的行的动态数据动态更新新MySQL表中的行?

从 GridView 获取正在编辑的行的 id