我正在尝试更改没有主键也没有自动增量列的表。我知道如何添加自动增量主键列。
我数据库中已经有 500 行,想给它们 id,但我不想手动执行。
如何自动向主键列插入数据?
添加
ALTER TABLE
列的 PRIMARY KEY
语句在我的测试中工作正常:
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
为了使现有主键为
auto_increment
,您可以使用:
ALTER TABLE table_name MODIFY id INT AUTO_INCREMENT;
对于像我这样遇到
Multiple primary key defined
错误的人,请尝试:
ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;
在 MySQL v5.5.31 上,这将
id
列设置为我的主键,并用递增值填充每一行。
是的,像这样的东西可以做到,但它可能不是最好的。您可能想要备份:
$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”,您可以一遍又一遍地运行它来尝试各种变化。
我无法正常工作的是传入的外键已经指向 USER_ID 字段的情况。 当我尝试使用来自另一个表的传入外键执行更复杂的示例时,我收到此消息。
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
我猜我需要在执行 ALTER 表之前拆除所有外键,然后重建它们。 但现在我想将此解决方案分享给原始问题的更具挑战性的版本,以防其他人遇到这种情况。
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 命令的原因。
ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY
删除现有字段并像这样再次创建它
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);
这里tableName
是你的桌子的名称,
tableName是你的列名,这是主要的,必须修改
MEDIUMINT是现有主键的数据类型
AUTO_INCRMENT你必须在 not null 之后添加 auto_increment 这将使主键自动递增。
这是当前创建的表 - 找到的记录数:4 name VARCHAR(20) YES 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是
这是寻求的最终结果(表说明)-
找到的记录数:4 名称 VARCHAR(20) 无 PRI 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是
而不是得到这个 -
找到的记录数:5 id int(11) 无 PRI 名称 VARCHAR(20) 是 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是
尝试后..
$query =“ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCRMENT FIRST, ADD PRIMARY KEY (id)”;
如何获得这个? -
找到的记录数:4 名称 VARCHAR(20) 无 PRI 品种 VARCHAR(30) 是 颜色 VARCHAR(20) 是 重量 SMALLINT(7) 是
即INSERT/ADD..等将主键插入第一个字段记录(不添加额外的“id”字段,如前所述。