在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;
答案 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 null
和unique
约束替换现有的主键约束。然后添加一个代理键。
-- 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.