我试图更改一张没有主键或自增列的表。我知道如何添加一个主键列,但我想知道是否可能自动插入数据到主键列中(我已经有了500行数据,想给它们分配id,但不想手动完成)。有什么想法吗?非常感谢。
我试图更改一张没有主键或自增列的表。我知道如何添加一个主键列,但我想知道是否可能自动插入数据到主键列中(我已经有了500行数据,想给它们分配id,但不想手动完成)。有什么想法吗?非常感谢。
在我的测试中,添加了 PRIMARY KEY
列的 ALTER TABLE
语句能够正常工作:
ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;
在为测试目的创建的临时表中,上述语句创建了AUTO_INCREMENT
id
列,并为表中每个现有行插入自增值,从1开始计数。
FIRST
,例如ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
。 - David ThomasLAST_INSERT_ID()
函数来获取该值,例如SELECT * FROM table_name WHERE id = LAST_INSERT_ID()
。大多数编程语言API都提供了一些函数/方法来在应用程序代码中返回该值。 - Michael Berkowski假设您没有像id、no这样的自动递增列,那么您可以使用以下查询语句添加:
假設您沒有像id、no這樣的自動遞增列,那麼您可以使用以下查詢語句添加:
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;
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
名称必须与之前选择的相同。我能够根据以下代码,将一个具有现有非自增主键的表格添加一个自增主键,并创建一个新的复合主键,其中旧主键和新主键作为复合主键:
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字段的外来FOREIGN KEY存在的情况下。当我尝试使用来自另一个表的更复杂的示例进行操作时,会出现此消息。
#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)
我猜在执行 ALTER table 命令之前需要先删除所有的外键, 然后再重新建立它们。如果其他人遇到同样的情况,现在我想分享一下解决原问题更具挑战性版本的方法。
ALTER TABLE mydb.mytable
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);
没有现有的主键
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`);
;
修改表 tableName 的主键 tableNameID,将数据类型改为 MEDIUMINT,并设置为非空和自增长。
这里的 tableName 是你的表名,
tableNameID 是需要修改的主键列名,
MEDIUMINT 是现有主键的数据类型,
在非空后添加 auto_increment 即可实现主键自增长......
希望这对你有所帮助:)
导出您的表格,然后清空您的表格,接着添加唯一的INT字段,然后将其更改为自动增量,最后再次导入之前导出的表格。
alter table
命令添加键,但 MySQL 不会为没有 ID 的字段生成 ID。你需要手动更新现有的字段,然后确保新的自增值从正确的偏移量开始 - 它默认为“1”,否则你最终会遇到重复键错误。 - Marc B