Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL报告主键,但无法将其从表中删除_Php_Mysql - Fatal编程技术网

Php MySQL报告主键,但无法将其从表中删除

Php MySQL报告主键,但无法将其从表中删除,php,mysql,Php,Mysql,我正在更新数据库中的一些表,我使用以下代码检查主键并删除它,然后添加一个新的主键 if(strpos($value,'PRIMARY') !== false) { $dropit = "DROP PRIMARY KEY ,"; $query = "ALTER TABLE `".$tablename."` ".$dropit." ADD PRIMARY KEY (`".$name."`);" ; } 当我运行时,出现以下错误: 1091-不能删除“主”;检查列/键是否存在SQL=

我正在更新数据库中的一些表,我使用以下代码检查主键并删除它,然后添加一个新的主键

if(strpos($value,'PRIMARY') !== false)
{
    $dropit = "DROP PRIMARY KEY ,";
    $query = "ALTER TABLE `".$tablename."` ".$dropit." ADD PRIMARY KEY (`".$name."`);" ;
}
当我运行时,出现以下错误:

1091-不能删除“主”;检查列/键是否存在SQL=ALTER 表'my_TABLE'删除主键,添加主键('id')

在谷歌搜索之后,我看到这个问题出现在MySQL bug reports表单上,比如2006年,所以我想现在应该已经解决了。我的SQL版本是5.1.44,所以不是非常旧。。。看起来,列可以看起来像主键,但不是主键。。。因此,我想知道是否有更好的方法来检查之前,我尝试和删除,以防止错误

我也在一些Drupal论坛上看到过这一点,但没有给出解决问题的线索


如果您想了解更多相关代码,请告诉我,我将添加。

尝试删除“添加主键”,并将其作为附加sql调用。

它正在尝试删除名为primary的键。虽然我不确定它为什么不起作用(正如清楚显示的
DROP主键
),但您可以尝试将SQL更改为以下内容:

ALTER TABLE `my_table` DROP KEY `key_name`, ADD PRIMARY KEY (`id`);

尝试翻转订单:

query = "ALTER TABLE `".$tablename."` ADD PRIMARY KEY(`".$name."`), DROP PRIMARY KEY;
SQL如下所示,能够在一条语句中更改表的主键:

alter table `sometable` add primary key(`newcolumn`),  drop PRIMARY key;
将其拆分为两条语句也可以,但是根据您的环境,您可能会失去一些原子性

看起来这也行得通,而且不依赖行为上的奇怪来正确工作:

alter table sometable drop key `PRIMARY`, add primary key(`somecolumn`);

这使我感到非常沮丧。当我跑步时:

mysql>描述我的_表

我得到:

+-------------+------------+-----+
| Field       | Type       | Key |
+-------------+------------+-----+
| FIELD_ONE   | datetime   |     |
| FIELD_TWO   | char(6)    | PRI |
| FIELD_THREE | int        | PRI |
+-------------+------------+-----+
但是当我运行
altertable my_TABLE DROP PRIMARY KEY
时,我收到
无法删除'PRIMARY';检查列/键是否存在
错误

于是,我跑了:

mysql>显示myu表中的索引

Key\u name
列中有一个旧键(使用的表列已经不存在了!?)。于是我跑了:

mysql>ALTER TABLE my\u TABLE DROP old\u key\u不存在

…而且成功了!我重新运行
描述我的_表
,得到:

+-------------+------------+-----+
| Field       | Type       | Key |
+-------------+------------+-----+
| FIELD_ONE   | datetime   |     |
| FIELD_TWO   | char(6)    |     |
| FIELD_THREE | int        |     |
+-------------+------------+-----+

运行InnoDB 5.7.23版。

我们需要更多的上下文:什么包含
$value
变量?。你为什么要删除并创建一个PK?它显然没有读取“主键”的全部值。如果您截断查询以简单地删除pk而不读取新的pk会怎么样。那么它能工作吗?删除“添加主键(““$name.””)不会产生任何效果。错误仍然发生。$value变量包含如下内容:主键(
表项id
)问题是,如果它已经存在,我总是必须删除它。。。如果我先添加它,我什么也做不到…事实上,如果你颠倒顺序,它们都在同一条语句中执行,除了该语句实际上是有效的。。。这两种操作都会发生,我可以使用此SQL更改表的主键。我知道这是可行的,但您不只是删除刚才添加的主键吗?我需要删除假定存在的主键,并用新的主键替换它。。。你的代码似乎弄巧成拙。。。但我不是MySQL专家,所以它可能在IDKNo中起作用,因为这是一个由MySQL决定事情发生顺序的语句。在这种情况下,添加和删除都会发生。注意:请参见编辑,有一种更简单、不太粗俗的方法可以做到这一点。它看起来像:[drop key`PRIMARY`]也可以。主键似乎被自动重命名为“Primary”…出于某种原因,这起作用了。。。我开始怀疑这是否只是我的开发环境(MAC上的XAMPP)