我需要一个只有在存在时才能删除主键的查询。
ALTER TABLE tablename DROP PRIMARY KEY;
如果它不存在,这将返回错误,但我的要求是在不同的数据库中运行查询。
答案 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');
WHERE
子句。 ANALYZE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, ';'
。我在研究和利用标准化技术时利用了information_schema。
Just about
您需要或想知道的关于表和列的所有内容都存在于某些系统表中(如果适用)
Database / Table_schema:
内部模式,例如“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