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

在mysql中重新定义主键时出错,mysql,primary-key,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 NU

我只是从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)
    -> );
然而,我发现如果我执行replace命令,它将复制行

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

看来我对主键的理解有点不对劲。这里有什么问题?

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

要使userid在Create表中唯一,请执行以下操作

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

发生此错误是因为您已经有一个主键是
id
。它是主键,因为它是
自动增量

现在,如果您希望您的
用户名
成为主键,请执行以下任一操作:

  • 您需要删除
    id
    全部:
    alter table auth drop id
  • 或者将其更改为一个简单的int列,而不是
    自动增量
    alter table auth modify id int
    。对于自动增量解决方案,可以创建插入前触发器
更新:不要试图将
id
作为主键,并将
unique
添加到用户名,因为这将在引用的表中产生副作用,因为
replace
命令将更改自动递增的
id

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

  • 确保表中没有重复的用户名
  • 发出以下命令:
    altertable auth username varchar(225)主键

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

主键必须是唯一的。让我们从这里开始查看删除重复行后的
ALTER TABLE auth ADD UNIQUE uid(userid)
。如何创建“before insert trigger”?@Droidzone trigger顾名思义,是一个依赖于要发生的另一个操作(或触发它的另一个操作)的操作。这可能发生在行动之前或之后。这里我们需要为insert生成一个值,因此触发器类型为“before insert”。在定义中,您可以阅读上一页。ID的值,并按1相加,然后分配给列值。