删除主键(如果存在)

时间:2016-08-10 06:39:20

标签: mysql constraints

我需要一个只有在存在时才能删除主键的查询。

ALTER TABLE tablename DROP PRIMARY KEY;

如果它不存在,这将返回错误,但我的要求是在不同的数据库中运行查询。

3 个答案:

答案 0 :(得分:2)

在MariaDB 10.2.16中,我能够通过以下方式解决此问题:

ALTER TABLE tablename DROP INDEX IF EXISTS `PRIMARY`;

这应该适用于任何表,因为MySQL文档中始终将MySQL中的主键称为PRIMARY

PRIMARY KEY的名称始终为PRIMARY,因此不能为 用作任何其他类型索引的名称。

答案 1 :(得分:1)

我建议使用它:

SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, 
' DROP PRIMARY KEY; ANALYZE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, ';') 
FROM information_schema.COLUMNS 
WHERE CONCAT(TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) IN  
    (SELECT CONCAT(TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
    FROM INFORMATION_SCHEMA.STATISTICS
    WHERE INDEX_NAME = 'PRIMARY' -- *Required* to get only the primary keys from the statistics table.
    -- *Optional*
    AND TABLE_SCHEMA = 'clients_database');
  • 运行此命令以生成所需的SQL。
  • 复制结果,然后将其作为工作查询运行。
  • ANALYZE TABLE是可选的以及WHERE子句。
  • 如果需要,您可以从以下查询中删除ANALYZE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, ';'

我在研究和利用标准化技术时利用了information_schema。

Just about您需要或想知道的关于表和列的所有内容都存在于某些系统表中(如果适用)

Database / Table_schema:

  

Note: From doc's

     
    

内部模式,例如“performance_schema”,“information”schema“,”sys“和”mysql“,默认情况下隐藏。切换显示元数据和内部模式首选项以列出它们在对象浏览器中。以“。”开头的模式也由此设置控制。

  

注意:Here's something similar that has been created.

希望这有帮助!

干杯,

答案 2 :(得分:-1)

我认为简单的选择可能就是这样:

首先去: 'YourDatabase'>表>您的表名>键>复制'PK__TableName__0001'等约束

然后运行:

Query:alter Table 'TableName' drop constraint PK__TableName__0001