我正在更新数据库中的一些表,我使用以下代码检查主键并删除它,然后添加一个新的主键。
if(strpos($value,'PRIMARY') !== false)
{
$dropit = "DROP PRIMARY KEY ,";
$query = "ALTER TABLE `".$tablename."` ".$dropit." ADD PRIMARY KEY (`".$name."`);" ;
}
当我运行时,我得到这个错误:
1091 - Can't DROP 'PRIMARY';检查列/键是否存在SQL=ALTER删除主键,添加主键(' id ');
经过一些谷歌搜索,我看到这个问题出现在MySQL的错误报告形式,如2006年,所以我认为它现在应该解决了。我的SQL版本是5.1.44,所以不是很旧…似乎一个列看起来像一个主键,但不是一个主键…所以我想知道是否有更好的方法来检查之前,我试图删除以防止错误。
我也在一些Drupal论坛上看到过这种情况,但是没有给出如何解决的线索…
如果你认为更多的周围代码会有帮助,让我知道,我会添加。
试图删除名为PRIMARY的键。虽然我不确定为什么它不工作(作为文档清楚地显示DROP PRIMARY KEY
),你可以尝试改变你的SQL如下:
ALTER TABLE `my_table` DROP KEY `key_name`, ADD PRIMARY KEY (`id`);
尝试删除"add primary key"并将其作为额外的sql调用
试着颠倒顺序:
query = "ALTER TABLE `".$tablename."` ADD PRIMARY KEY(`".$name."`), DROP PRIMARY KEY;
SQL看起来像这样,并且能够在一条语句中更改表的主键:
alter table `sometable` add primary key(`newcolumn`), drop PRIMARY key;
将它分成2条语句也可以,但是这样可能会失去一些原子性,这取决于您的环境。
看起来也可以工作,并且不依赖于行为中的陌生性来正确工作:
alter table sometable drop key `PRIMARY`, add primary key(`somecolumn`);
这让我很沮丧。当我运行:
mysql> describe my_table;
+-------------+------------+-----+
| Field | Type | Key |
+-------------+------------+-----+
| FIELD_ONE | datetime | |
| FIELD_TWO | char(6) | PRI |
| FIELD_THREE | int | PRI |
+-------------+------------+-----+
但是当我运行ALTER TABLE my_table DROP PRIMARY KEY
时,我收到了Can't DROP 'PRIMARY'; check that column/key exists
错误。
所以,我输入:
mysql> SHOW INDEX FROM my_table;
在Key_name
列中有一个旧键(使用甚至不再存在的表列!?)然后我输入:
mysql> ALTER TABLE my_table DROP old_key_that_does_not_exist;
…这招奏效了!我重新运行了DESCRIBE my_table
,得到:
+-------------+------------+-----+
| Field | Type | Key |
+-------------+------------+-----+
| FIELD_ONE | datetime | |
| FIELD_TWO | char(6) | |
| FIELD_THREE | int | |
+-------------+------------+-----+
运行5.7.23 InnoDB版本。