在mysql中重新定义主键时出错

时间:2015-09-20 11:18:11

标签: mysql primary-key

我刚开始使用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

因此,我对主键的理解似乎有些不对劲。这里的问题是什么?

1 个答案:

答案 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,则它必须是主键。