在mysql中重新定义主键时出错
我只是从mysql开始。我正在尝试设计一个表,其中的列包含一个自动递增的id、一个唯一的用户名(userid)和一个密码 起初,我认为id应该是主键,这样我就可以很容易地更新涉及号码的数据,就像在一些论坛软件中所做的那样 因此,我创建了以下表格:在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
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相加,然后分配给列值。