我尝试删除以前创建为info varchar(255) unique
的h2中的列的唯一约束。
我试过了:
sql> alter table public_partner drop constraint (select distinct unique_index_name from in
formation_schema.constraints where table_name='PUBLIC_PARTNER' and column_list='INFO');
但没有成功(如下):
Syntax error in SQL statement "ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT ([*]SELECT DISTI
NCT UNIQUE_INDEX_NAME FROM INFORMATION_SCHEMA.CONSTRAINTS WHERE TABLE_NAME='PUBLIC_PARTNER
' AND COLUMN_LIST='INFO') "; expected "identifier"; SQL statement:
alter table public_partner drop constraint (select distinct unique_index_name from informa
tion_schema.constraints where table_name='PUBLIC_PARTNER' and column_list='INFO') [42001-1
60]
如何正确删除此约束?
顺便说一下:
sql> (select unique_index_name from information_schema.constraints where table_name='PUBLI
C_PARTNER' and column_list='INFO');
UNIQUE_INDEX_NAME
CONSTRAINT_F574_INDEX_9
(1 row, 0 ms)
似乎返回正确的输出。
答案 0 :(得分:10)
在SQL语言中,标识符名称不能是表达式。您需要运行两个语句:
select distinct constraint_name from information_schema.constraints
where table_name='PUBLIC_PARTNER' and column_list='INFO'
然后获取标识符名称,并运行语句
ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT <xxx>
答案 1 :(得分:5)
您可以使用用户定义的函数来执行动态创建的语句。首先创建execute
别名(仅一次):
CREATE ALIAS IF NOT EXISTS EXECUTE AS $$ void executeSql(Connection conn, String sql)
throws SQLException { conn.createStatement().executeUpdate(sql); } $$;
然后调用此方法:
call execute('ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT ' ||
(select distinct unique_index_name from in formation_schema.constraints
where table_name='PUBLIC_PARTNER' and column_list='INFO'));
...其中execute
是运行语句的用户定义函数。
答案 2 :(得分:1)
如果您在 PosgreSQL模式中使用带有Spring Boot的H2,则查询必须包含模式public
,并且表可能处于小写模式。 (请参见下面的application.yml
)
检查信息模式表中的字母大小写,并使用表information_schema.constraints
中的大写和小写。
SET @constraint_name = QUOTE_IDENT(
SELECT DISTINCT constraint_name
FROM information_schema.constraints
WHERE table_schema = 'public'
AND table_name = 'public_partner'
AND constraint_type = 'UNIQUE'
AND column_list = 'info');
SET @command = 'ALTER TABLE public.public_partner DROP CONSTRAINT public.' || @constraint_name;
SELECT @command;
EXECUTE IMMEDIATE @command;
说明:
SELECT DISTINCT约束名称[...]
从架构信息中选择具有UNIQUE约束的Columns约束名称。
QUOTE_IDENT([...])
我不知道为什么需要这样做,它将引用结果字符串
SET @constraint_name = [...];
存储在变量@constraint_name中
SET @command = [...];
通过字符串连接组成整个命令,并存储在变量@command中
SELECT @command;
仅在调试时在屏幕上显示组成的查询
立即执行@command;
执行@command
Spring Boot application.yml
中的 PostgreSQL模式中的典型H2配置(提取)
spring:
# [...]
jpa:
database-platform: org.hibernate.dialect.H2Dialect
# [...]
datasource:
url: jdbc:h2:mem:testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false
username: sa
password: sa
# [...]