删除主键(如果存在)

Jee*_*van 7 mysql constraints

我需要一个仅在主键存在时才可以删除主键的查询。

ALTER TABLE tablename DROP PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)

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

Mir*_*ous 7

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

ALTER TABLE tablename DROP INDEX IF EXISTS `PRIMARY`;
Run Code Online (Sandbox Code Playgroud)

这应该适用于任何表,因为 MySQL 中的主键总是PRIMARY按照 MySQL 文档中所述调用:

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


Jay*_*zzo 2

我建议使用这个:

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');
Run Code Online (Sandbox Code Playgroud)
  • 运行此命令以生成所需的 SQL。
  • 复制结果,然后将它们作为工作查询运行。
  • ANALYZE TABLE 和子句一样都是可选的WHERE
  • 如果需要,您可以ANALYZE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, ';'从下面的查询中删除。

在研究和利用标准化技术时,我利用了信息模式。

Just about您需要或想要了解的有关表和列的所有内容都位于任一系统表中(如果适用)

数据库/表架构:

注意:来自文档

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

注意:这是已创建的类似内容。

希望这可以帮助!

干杯,

杰伊