【问题标题】:Error redefining primary key in mysql在mysql中重新定义主键时出错
【发布时间】:2015-09-20 11:18:11
【问题描述】:

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

所以我对主键的理解似乎有些问题。这里有什么问题?

【问题讨论】:

标签: mysql primary-key


【解决方案1】:

由于您已经有一个主键id,因此发生此错误。它是主键,因为它是auto_increment

现在,如果您希望您的 username 成为主键,则:

  • 你需要完全删除idalter table auth drop id;
  • 或者将其更改为简单的 int 列,而不是 auto_increment: alter table auth modify id int。对于自动增量解决方法,您可以创建一个插入前触发器。

更新:不要尝试将id 保留为主键并将unique 添加到用户名,因为这会对引用的表产生副作用,因为replace 命令将更改auto_incremented id 的值

完成上述任何一项后,然后:

  • 确保您的表格中没有用户名重复
  • 发出这个:alter table auth username varchar(225) primary key;

注意:请确保在将 id 作为主键时不要使 username 唯一,因为如果索引值相同,replace 命令将在添加新记录之前删除旧记录,并且执行因此,auto_incremented id 将再次递增,这将影响引用表的值。

【讨论】:

  • 如何创建“插入前触发器”?
  • @Droidzone Trigger 顾名思义,是一个依赖于另一个动作发生(或另一个动作来触发它)的动作。它可以在该动作之前或之后发生。这里我们需要为insert生成一个值,所以触发类型为“before insert”。在定义中,您阅读了上一个。 ID 的值并加一并分配给列值。 dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html
【解决方案2】:

主键应该是唯一的并且不为空(根据定义),并且您的用户 ID 不是唯一的

要使创建表中的用户 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),
    unique key(userid)
);

或如@hjpotter92 所说

ALTER TABLE auth ADD UNIQUE uid (userid)

事后进行(通过show create table auth可以看到生成的架构)


请记住,每个表只能有一个主键,如果列是auto_inc,则它必须是主键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2015-06-22
    • 1970-01-01
    • 2014-11-13
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多