MySql:删除所有现有主键并插入新的自动增量主键

时间:2015-12-15 10:40:48

标签: mysql database primary-key

在MySql数据库表中,已经存在两个主要(复合),并且该表有大约50000行。

现在我需要删除这些主键并添加新的自动增量主键id

我需要所有的行都保持不变,并且会被分配唯一的ID。

现在要执行此操作的查询字符串是什么。

我尝试了以下代码,但出现了错误

#1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以便在“ADD id INT PRIMARY KEY AUTO_INCREMENT'附近使用正确的语法。第1行

ALTER TABLE `table_name` DROP PRIMARY KEY ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

2 个答案:

答案 0 :(得分:0)

得到了答案,我错过了两个sql语句之间的逗号。

正确的代码将是

  ALTER TABLE `table_name` DROP PRIMARY KEY, ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

答案 1 :(得分:0)

不要只是删除现有的主键。将它们替换为not null unique个约束,然后然后添加一个代理键。这就是原因。 (PostgreSQL,但原理是一样的。)

create table elements (
  chemical_symbol varchar(2) primary key,
  atomic_number int not null unique,
  element_name varchar (35) not null unique
);

insert into elements values
('H', 1, 'hydrogen'),
('He', 2, 'helium'),
('Li', 3, 'lithium'),
('Be', 4, 'beryllium')
-- many more rows
;

如果你只是删除现有的主键约束并添加代理键,就像这样。 。

-- DON'T DO THIS.
alter table elements drop constraint elements_pkey,
add column element_id serial primary key;

。 。 。你失去了“chemical_symbol”必须是唯一的商业规则。

insert into elements (chemical_symbol, atomic_number, element_name)
values ('H', 5, 'boron');

select * from elements
order by chemical_symbol;
chemical_symbol  atomic_number  element_name  element_id
--
Be               4              beryllium     4
H                1              hydrogen      1
H                5              boron         5
He               2              helium        2
Li               3              lithium       3

现在两个元素有化学符号'H'。这是一个错误。

而是使用not nullunique约束替换现有的主键约束。然后添加一个代理键。

-- Do this instead.
alter table elements drop constraint elements_pkey,
add constraint elements_chemical_symbol_key unique (chemical_symbol),
alter column chemical_symbol set not null,
add column element_id serial primary key;

现在,如果您尝试插入具有重复的chemical_symbol的行,则dbms将引发错误。

insert into elements (chemical_symbol, atomic_number, element_name)
values ('H', 5, 'Boron');
ERROR: duplicate key value violates unique constraint "elements_chemical_symbol_key"
SQL state: 23505
Detail: Key (chemical_symbol)=(H) already exists.