我试图在不丢失数据的情况下删除sql server 2008中的非空约束.
我有一个数据库,在字段上有一个NOT NULL约束,我想删除这个约束.复杂因素是此约束具有系统定义的名称,并且该约束的名称在生产服务器,集成服务器和各种开发人员数据库之间不同.我们当前的过程是检入更改脚本,并且自动化任务通过sqlplus对目标数据库执行适当的查询,因此我更喜欢可以直接发送到sqlplus的解决方案.
在我自己的数据库中,删除它的SQL将是:
alter table MYTABLE drop constraint SYS_C0044566
Run Code Online (Sandbox Code Playgroud)
查询all_constraints视图时,我可以看到约束:
select * from all_constraints where table_name = 'MYTABLE'
Run Code Online (Sandbox Code Playgroud)
但我不知道如何配合工作SEARCH_CONDITION的LONG数据类型或如何最好地动态删除即使我知道它的名字查找到的约束.
那么,我如何创建一个更改脚本,可以根据它的内容而不是它的名称来删除这个约束?
编辑:@ Allan的回答很好,但我担心(由于我缺乏Oracle的专业知识),任何可能具有系统生成名称的约束都可能与其相关联,这可能并不普遍.约束而不必知道它的名字.在逻辑上删除该约束时,总会有一种方法可以避免必须知道系统命名约束的名称吗?
我发现使用可写CTE模拟PostgreSQL中的upsert是一个非常优雅的解决方案,直到我们在Postgres中获得实际的upsert/merge.(见:https://stackoverflow.com/a/8702291/558819)
但是,有一个问题:如何插入默认值?NULL当然,使用将无助于NULL显式插入NULL,与MySQL不同.一个例子:
WITH new_values (id, playlist, item, group_name, duration, sort, legacy) AS (
VALUES (651, 21, 30012, 'a', 30, 1, FALSE)
, (NULL::int, 21, 1, 'b', 34, 2, NULL::boolean)
, (668, 21, 30012, 'c', 30, 3, FALSE)
, (7428, 21, 23068, 'd', 0, 4, FALSE)
), upsert AS (
UPDATE playlist_items m
SET (playlist, item, group_name, duration, sort, legacy)
= (nv.playlist, nv.item, nv.group_name, nv.duration, nv.sort, nv.legacy)
FROM new_values nv
WHERE …Run Code Online (Sandbox Code Playgroud) sql ×2
constraints ×1
merge ×1
oracle ×1
plsql ×1
postgresql ×1
sql-insert ×1
sql-server ×1
upsert ×1