我刚开始使用mysql。我试图设计一个表,其中包含一个自动递增的id,一个唯一的用户名(userid)和一个密码。
最初,我认为id应该是主键,这样我就可以轻松更新数据,这与一些论坛软件相同。
所以我创建了表:
CREATE TABLE IF NOT EXISTS auth (
-> id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> userid VARCHAR(30) NOT NULL,
-> password VARCHAR(30) NOT NULL,
-> role VARCHAR(20) NOT NULL,
-> email VARCHAR(50)
-> );
但是我发现如果我执行了替换命令,它会复制行。
mysql> SELECT * FROM `auth`;
+----+--------+-----------------+---------------+-------+
| id | userid | password | role | email |
+----+--------+-----------------+---------------+-------+
| 1 | jody | pw | administrator | NULL |
+----+--------+-----------------+---------------+-------+
1 row in set (0.00 sec)
mysql> REPLACE INTO `auth` SET `userid` = "jody", `password` = "pw", `role` = "administrator";
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM `auth`;
+----+--------+-----------------+---------------+-------+
| id | userid | password | role | email |
+----+--------+-----------------+---------------+-------+
| 1 | jody | pw | administrator | NULL |
| 2 | jody | pw | administrator | NULL |
+----+--------+-----------------+---------------+-------+
2 rows in set (0.00 sec)
然后我尝试将主键更改为用户名,但遇到了这个:
mysql> alter table `auth` drop primary key, add primary key (`userid`);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
因此,我对主键的理解似乎有些不对劲。这里的问题是什么?
答案 0 :(得分:1)
主键应该是唯一的,而不是null(根据定义),并且您的用户标识不是唯一的
要使“创建表”中的用户标识唯一,请执行此操作
CREATE TABLE IF NOT EXISTS auth
( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
userid VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
role VARCHAR(20) NOT NULL,
email VARCHAR(50),
unique key(userid)
);
或者@ hjpotter92说
ALTER TABLE auth ADD UNIQUE uid (userid)
事后做(并且可以通过show create table auth
看到生成的模式)
请记住,每个表只能有一个主键,如果列是auto_inc,则它必须是主键。