是否可以限制一个表在mysql中只有一个记录?

pou*_*uya 5 mysql row restriction

嗨,我是Web开发领域的一名新手。我想为管理员登录创建一个表,该表只有一个记录(因为只有一个管理员)。我想知道是否可以通过某种方式设置MySQL以将特殊表限制为仅包含一条记录?

Gwy*_*ind 7

尽管其他答案是正确的,可以使用更好的方法来解决您的特定问题,但可以通过添加仅包含单个个案的虚拟枚举列并将其设为UNIQUE KEY(或表格的PRIMARY KEY)来创建单行表格:

mysql> CREATE TABLE only_one_row (
    restriction ENUM('') NOT NULL,
    single_row_value DATETIME NOT NULL,
    PRIMARY KEY (restriction)
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO only_one_row (single_row_value) VALUES (NOW());
Query OK, 1 rows affected (0.00 sec)

mysql> INSERT INTO only_one_row (single_row_value) VALUES ('2016-01-01');
ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY"

mysql> SELECT * FROM only_one_row;
+-------------+---------------------+
| restriction | single_row_value    |
+-------------+---------------------+
|             | 2016-01-01 00:00:00 |
+-------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

之所以可行,是因为该列只能有一个值(ENUM只有一个大小写,不能是NULL),并且UNIQUE(或PRIMARY)键强制表中的每一行都必须对该列具有不同的值。

可以以明显的方式扩展它,以创建只能包含0到任意特定数量的行的表,最大限制为ENUM。MySQL 5.7中的限制实际上是255种情况,但是到那时,改用UNQIUE KEYover TINYINT UNSIGNED列会更容易。但是,我无法找到一个方法来强制一个表有两种 0或N行; 该解决方案将仅强制执行“ 0到N之间”,因为MySQL没有工作CHECK约束。(当然,在本例中,当N为1时,可获得相同的效果。)

注意:尽管似乎可以使用生成的虚拟列来避免为限制枚举占用额外的存储字节,但是不幸的是,如果尝试使用大多数版本的MySQL和MariaDB,则会抛出各种错误,因为常量值不能用作生成的列,或者如果您诱使数据库允许这样做(例如使用GENERATED ALWAYS AS (LEAST(GREATEST(single_row_value,0),0)) VIRTUAL),因为存储引擎不喜欢在虚拟生成的列上放置索引。自从5.7.8起,该文件就可以在MySQL中的InnoDB中使用,但是在撰写本文时,它在MariaDB 10.1中绝对不起作用。

编辑添加:这不是万无一失的。“ an”的“错误”值ENUM为零,索引从1开始,因此INSERT INTO only_one_row VALUES (0,...); INSERT INTO only_one_row VALUES (1,...);将成功。但是,在正常操作中不太可能出现这种情况,并且与触发器相比,保持跟踪更容易!


Jig*_*dya 6

您可以设置一个对记录进行计数的触发器(具体来说,是一个“插入”触发器),如果count大于1,则不允许进行插入操作。

查看http://dev.mysql.com/doc/refman/5.0/en/insert.html并相应地设置逻辑。