嗨,我是网络开发领域的新手。我想为管理员登录创建一个只有一条记录的表(因为只有一个管理员)。我想知道是否可以设置MySQL以限制特殊表只有一个记录?
答案 0 :(得分:5)
虽然其他答案是正确的,但是对于您的特定问题有更好的方法,可以通过添加仅包含单个案例的虚拟枚举列来创建单行表,并使其成为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 |
+-------------+---------------------+
):
ENUM
这是有效的,因为该列只能有一个值(NULL
只有一个案例,不能是UNIQUE
),而PRIMARY
(或{{ 1}})key强制表中的每一行必须具有不同的列值。
这可以以显而易见的方式扩展,以创建只能包含0到任意特定行数的表,最高可达ENUM
的实际限制。 MySQL 5.7中的限制实际上是255个案例,但到那时,UNQIUE KEY
更容易取代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。
已编辑添加: 这不是万无一失的。 ENUM
的“错误”值为零,索引从1开始,因此INSERT INTO only_one_row VALUES (0,...); INSERT INTO only_one_row VALUES (1,...);
将成功。但是,在正常操作中不太可能出现这种情况,并且跟踪触发器仍然更容易跟踪!
答案 1 :(得分:4)
您可以设置一个计数记录的触发器(具体来说就是一个Insert触发器),如果count大于1,则不允许插入操作。
查看http://dev.mysql.com/doc/refman/5.0/en/insert.html并相应地设置您的逻辑。
答案 2 :(得分:1)
有很多方法可以比数据库中的“强制一行”好很多。
创建用户的表格并在其中创建一个字段,该字段将用户标识为管理员。这可以很简单:
create table users (id int not null primary key auto_increment, name varchar(20), is_admin bool default 0);
然后,您只需为管理员设置is_admin
为1
,然后搜索管理员:
select id,name from users where is_admin;
非管理员的所有用户:
select id,name from users where not is_admin;
创建另一个表,使用外键关系将用户标识为管理员。
create table users (id int not null auto_increment primary key, name varchar(25));
create table admins (id int not null auto_incrememnt primary key, userid int, foreign key (userid) references users(id));
现在,当您插入管理员用户时,只需添加对admins
的引用。此方法允许您在此admins
表中包含其他标志和属性(而不是稍后在users
表中添加大量列)。