使用SQL删除DB2约束

使用SQL删除DB2约束,sql,db2,constraints,Sql,Db2,Constraints,我有一个名为“test”的DB2数据库,我使用下面的查询在那里创建了一个表 CREATE TABLE IDP_PROVISIONING_ENTITY ( ID INTEGER NOT NULL, PROVISIONING_CONFIG_ID INTEGER NOT NULL, ENTITY_TYPE VARCHAR(255) NOT NULL, ENTITY_LOCAL_USERSTORE VARCHAR(255) NOT NULL

我有一个名为“test”的DB2数据库,我使用下面的查询在那里创建了一个表

CREATE TABLE IDP_PROVISIONING_ENTITY (
        ID INTEGER NOT NULL,
        PROVISIONING_CONFIG_ID INTEGER NOT NULL,
        ENTITY_TYPE VARCHAR(255) NOT NULL,
        ENTITY_LOCAL_USERSTORE VARCHAR(255) NOT NULL,
        ENTITY_NAME VARCHAR(255) NOT NULL,
        ENTITY_VALUE VARCHAR(255) NOT NULL,
        TENANT_ID INTEGER NOT NULL,
        PRIMARY KEY (ID),
        UNIQUE (ENTITY_TYPE, TENANT_ID, ENTITY_LOCAL_USERSTORE, ENTITY_NAME),
        UNIQUE (PROVISIONING_CONFIG_ID, ENTITY_TYPE, ENTITY_VALUE),
        FOREIGN KEY (PROVISIONING_CONFIG_ID) REFERENCES IDP_PROVISIONING_CONFIG(ID) ON DELETE CASCADE)
/
我想使用sql从这个表中删除约束“UNIQUE(ENTITY_TYPE、TENANT_ID、ENTITY_LOCAL_USERSTORE、ENTITY_NAME)”。我该怎么做

更新 我发现,如果我有一个约束名称,我可以使用下面的命令删除一个唯一的约束

"ALTER TABLE IDP_PROVISIONING_ENTITY DROP UNIQUE <CONSTRAINT NAME>"
“ALTER TABLE IDP\u PROVITIONING\u ENTITY DROP UNIQUE”
这些约束名称也可以在表“sysibm.sysabconst”和“SYSCAT.TABCONST”中找到

但我仍然面临的问题是,如何通过使用与唯一约束相关联的列来获取其名称?

第一次运行

select INDNAME from SYSCAT.TABCONST WHERE TABNAME='IDP_PROVISIONING_ENTITY' AND COLNAMES='+ENTITY_TYPE+TENANT_ID+ENTITY_LOCAL_USERSTORE+ENTITY_NAME
因此,您将在此处获得约束名称: 例如:SQL1602151106360

然后跑

ALTER TABLE IDP_PROVISIONING_ENTITY DROP CONSTRAINT SQL160215110206360

我使用的是
SYSCAT.KEYCOLUSE
。这样我就可以删除唯一的约束。否则就不行了。关键在于找到约束的正确名称。唯一约束是由它自己的约束组合而成的,它的名称是
SQL190703165844530
和唯一索引,唯一索引有它自己不同的名称,例如
sql19070316584444

select * from SYSCAT.KEYCOLUSE where TABSCHEMA = <TABSCHEMA> and TABNAME = <TABNAME>;
从SYSCAT.KEYCOLUSE中选择*,其中TABSCHEMA=和TABNAME=;
然后,可以通过子句将唯一约束和索引一起删除 :

alter table drop unique;

Alter table drop约束。(您必须首先找到约束名称。)我如何才能找到它,我检查了“SYSCAT.INDEXES”表,但当我有两个数据库具有相同的表时,我无法检索所需表的约束名称。请检查
SYSCAT.TABCONST
当两个数据库具有相同的表时,我仍然看不到获得所需约束的方法。由于它是一个测试数据库,您不能删除该表并重新创建它-这次没有唯一的约束。这是不正确的。为约束创建的索引不一定与约束具有相同的名称。正如@data\u henrik在上面的评论中提到的,您必须查看
SYSCAT.TABCONST
以获得正确的约束名称。谢谢,我将更正答案,但仍然无法使用与该(唯一)约束相关联的列来获得约束名称?更正了答案
alter table <TABLE_NAME> drop unique <CONSTRAINT_NAME>;