我正在尝试更改一个没有主键也没有 auto_increment 列的表。我知道如何添加主键列,但我想知道是否可以自动将数据插入主键列(我在数据库中已经有 500 行并且想给它们 id 但我不想手动执行) .有什么想法吗?非常感谢。
alter table
来添加密钥,但 MySQL 不会为没有 ID 的字段生成 ID。您必须手动更新现有字段,然后确保您的新 auto_increment 从正确的偏移量开始 - 它默认为“1”,无论如何您最终都会遇到重复的键错误。
添加 PRIMARY KEY
列的 ALTER TABLE
语句在我的测试中正常工作:
ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;
在为测试目的而创建的临时表上,上述语句创建了 AUTO_INCREMENT
id
列,并为表中的每个现有行插入了自动增量值,从 1 开始。
假设您没有像 id 这样的自动增量列,没有,那么您可以使用以下查询添加:
ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST
如果您有列,则使用以下查询更改为自动递增:
ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
FIRST
有什么作用?
id
列成为表中的第一个而不是最后一个,这是默认行为。
对于像我这样遇到 Multiple primary key defined
错误的人,请尝试:
ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;
在 MySQL v5.5.31 上,这将 id
列设置为我的主键,并用递增值填充每一行。
为了使现有的主键为 auto_increment
,您可以使用:
ALTER TABLE table_name MODIFY id INT AUTO_INCREMENT;
是的,这样的事情可以做到,但它可能不是最好的。您可能想要进行备份:
$get_query = mysql_query("SELECT `any_field` FROM `your_table`");
$auto_increment_id = 1;
while($row = mysql_fetch_assoc($get_query))
{
$update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
$auto_increment_id++;
}
请注意,更新时您选择的 any_field
必须相同。
我找到的最简单和最快的就是这个
ALTER TABLE mydb.mytable
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);
我能够调整这些说明,获取具有现有非增量主键的表,并向表中添加一个递增主键,并使用以下命令创建一个新的复合主键,并将旧键和新键作为复合主键代码:
DROP TABLE IF EXISTS SAKAI_USER_ID_MAP;
CREATE TABLE SAKAI_USER_ID_MAP (
USER_ID VARCHAR (99) NOT NULL,
EID VARCHAR (255) NOT NULL,
PRIMARY KEY (USER_ID)
);
INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');
ALTER TABLE SAKAI_USER_ID_MAP
DROP PRIMARY KEY,
ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST,
ADD PRIMARY KEY ( _USER_ID, USER_ID );
完成此操作后,_USER_ID 字段将存在,并且主键的所有数字值与您期望的完全一样。使用顶部的“DROP TABLE”,您可以一遍又一遍地运行它来试验变化。
我无法开始工作的是有传入的 FOREIGN KEY 已经指向 USER_ID 字段的情况。当我尝试使用来自另一个表的传入外键执行更复杂的示例时,我收到此消息。
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
我猜我需要在执行 ALTER 表之前拆除所有外键,然后再重建它们。但是现在我想将这个解决方案分享给原始问题的更具挑战性的版本,以防其他人遇到这种情况。
导出您的表,然后清空您的表,然后将字段添加为唯一 INT,然后将其更改为 AUTO_INCREMENT,然后再次导入您之前导出的表。
您可以使用以下命令将新的主键列添加到可以具有序列号的现有表中:
ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
我遇到了同样的问题,所以我做了什么我删除了主键的字段,然后我重新创建了它并确保它是自动增量的。这对我有用。我希望它可以帮助别人
ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT;
这里 tableName 是你的表的名称,
tableName 是您的主要列名,必须修改
MEDIUMINT 是现有主键的数据类型
AUTO_INCREMENT 你必须在非空之后添加 auto_increment
它将使主键 auto_increment ......
希望这会有所帮助:)
好吧,您有多种方法可以做到这一点: - 如果您的表上没有任何数据,只需删除它并重新创建它。
删除现有字段并像这样再次创建它
ALTER TABLE test DROP PRIMARY KEY, DROP test_id, ADD test_id int AUTO_INCREMENT NOT NULL FIRST, ADD PRIMARY KEY (test_id);
或者只是修改它
ALTER TABLE test MODIFY test_id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (test_id);
如何编写 PHP 来更改已经存在的字段(在本例中为名称)以使其成为主键? W/o,当然,向表中添加任何额外的“id”字段..
这是当前创建的表 - 找到的记录数:4 名称 VARCHAR(20) 是品种 VARCHAR(30) 是颜色 VARCHAR(20) 是重量 SMALLINT(7) 是
这是寻求的最终结果(表描述)-
找到的记录数:4 名称 VARCHAR(20) NO PRI 品种 VARCHAR(30) YES color VARCHAR(20) YES weight SMALLINT(7) YES
而不是得到这个 -
找到的记录数:5 id int(11) NO PRI 名称 VARCHAR(20) YES 品种 VARCHAR(30) YES color VARCHAR(20) YES weight SMALLINT(7) YES
试过之后。。
$query = "ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";
如何得到这个? -
找到的记录数:4 名称 VARCHAR(20) NO PRI 品种 VARCHAR(30) YES color VARCHAR(20) YES weight SMALLINT(7) YES
即 INSERT/ADD.. 等主键 INTO 第一个字段记录(不添加额外的“id”字段,如前所述。
没有现有的主键
ALTER TABLE `db`.`table`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (`id`);
;
表已经有一个现有的主键列
(它不会删除旧的主键列)
ALTER TABLE `db`.`table`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
CHANGE COLUMN `prev_column` `prev_column` VARCHAR(2000) NULL ,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`);
;
注意:对于自动增量,列必须是第一个,这就是 FIRST 命令的原因。
FIRST
例如ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
LAST_INSERT_ID()
SELECT * FROM table_name WHERE id = LAST_INSERT_ID()
,并且大多数编程语言 API 提供一些函数/方法来在应用程序代码中返回该值。