我需要一个仅在主键存在时才可以删除主键的查询。
ALTER TABLE tablename DROP PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)
如果不存在,这将返回错误,但我的要求是在不同的数据库中运行查询。
在 MariaDB 10.2.16 中我能够通过以下方式解决这个问题:
ALTER TABLE tablename DROP INDEX IF EXISTS `PRIMARY`;
Run Code Online (Sandbox Code Playgroud)
这应该适用于任何表,因为 MySQL 中的主键总是PRIMARY按照 MySQL 文档中所述调用:
PRIMARY KEY 的名称始终是 PRIMARY,因此不能用作任何其他类型索引的名称。
我建议使用这个:
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)
WHERE。 ANALYZE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, ';'从下面的查询中删除。在研究和利用标准化技术时,我利用了信息模式。
Just about您需要或想要了解的有关表和列的所有内容都位于任一系统表中(如果适用)
数据库/表架构:
默认情况下,内部架构(例如“performance_schema”、“information”schema”、“sys”和“mysql”)是隐藏的。切换“显示元数据和内部架构”首选项以在对象浏览器中列出它们。以“开头的架构” .” 也受此设置控制。
注意:这是已创建的类似内容。
希望这可以帮助!
干杯,
杰伊