sys.default_constraints的详解

本文深入探讨了SQL Server 2012中sys.default_constraints视图的功能,包括其作用、组成部分以及如何利用此视图来管理默认约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sys.default_constraints (Transact-SQL)

SQL Server 2012
此主题尚未评级 - 评价此主题

sys.objects.type = D." data-guid="c70d280d380e05f4976e4c29eaf29094">作为默认定义且 sys.objects.type = D 的每个对象在表中各对应一行,该默认定义是作为 CREATE TABLE 或 ALTER TABLE 语句的一部分创建的,而不是作为 CREATE DEFAULT 语句的一部分创建的。

列名

数据类型

说明

<从 sys.objects 继承的列>

 

sys.objects (Transact-SQL).' data-guid="c5c0db2376dacb2a7115310a35a4a170">有关此视图所继承列的列表,请参阅sys.objects (Transact-SQL)

parent_column_id

int

parent_object_id to which this default belongs." data-guid="308e2091fd3ce87097b94cdcda8adfb7">此默认值所属的 parent_object_id 中的列的 ID。

定义

nvarchar(max)

定义此默认值的 SQL 表达式。

is_system_named

bit

1 = 名称由系统生成。

0 = 名称由用户提供。

转载于:https://www.cnblogs.com/zhulinmails/archive/2012/05/25/2518591.html

<think>我们有一段PL/pgSQL代码,用于在PostgreSQL数据库中为特定模式(ppm)下的所有没有主键但包含id列的表添加主键约束(使用id列作为主键)。 代码使用匿名代码块(DO $$ ... $$)执行,包含一个循环,遍历所有符合条件的表,并尝试为每个表添加主键。 下面逐部分解读代码:</think>以下是对您提供的 PostgreSQL PL/pgSQL 代码的详细解读: ```sql DO $$ DECLARE tbl record; -- 声明记录变量,用于存储查询结果 BEGIN -- 循环遍历所有符合条件的表 FOR tbl IN -- 查询所有没有主键但包含id列的表 SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = 'ppm' -- 限定在ppm模式 AND t.table_type = 'BASE TABLE' -- 只处理基本表(非视图) AND NOT EXISTS ( -- 排除已有主键的表 SELECT 1 FROM information_schema.table_constraints tc WHERE tc.table_schema = t.table_schema AND tc.table_name = t.table_name AND tc.constraint_type = 'PRIMARY KEY' ) AND EXISTS ( -- 只处理包含id列的表 SELECT 1 FROM information_schema.columns c WHERE c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.column_name = 'id' ) LOOP BEGIN -- 动态执行ALTER TABLE添加主键 EXECUTE format('ALTER TABLE %I ADD PRIMARY KEY (id)', tbl.table_name); -- 成功提示 RAISE NOTICE '已为表 % 添加id主键', tbl.table_name; EXCEPTION WHEN OTHERS THEN -- 捕获所有异常 -- 失败警告 RAISE WARNING '无法为表 % 添加主键: %', tbl.table_name, SQLERRM; END; END LOOP; END $$; ``` ### 代码功能详解: 1. **整体功能**: - 在 `ppm` 模式(schema)下查找所有**没有主键**但**包含id列**的表 - 为这些表动态添加以 `id` 列为主键的约束 2. **关键组件解析**: - **`DO $$ ... $$`**:创建匿名代码块(立即执行) - **`DECLARE tbl record`**:声明记录变量存储查询结果 - **`FOR ... LOOP`**:遍历查询返回的所有表名 - **`EXECUTE format(...)`**:动态执行SQL(安全处理表名) - **`EXCEPTION WHEN OTHERS`**:捕获并处理所有执行异常 3. **查询逻辑详解**: ```sql SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = 'ppm' -- 限定ppm模式 AND t.table_type = 'BASE TABLE' -- 排除视图 AND NOT EXISTS ( -- 过滤已有主键的表 SELECT 1 FROM information_schema.table_constraints tc WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = t.table_name AND tc.table_schema = t.table_schema ) AND EXISTS ( -- 确保表包含id列 SELECT 1 FROM information_schema.columns c WHERE c.column_name = 'id' AND c.table_name = t.table_name AND c.table_schema = t.table_schema ) ``` 4. **安全特性**: - 使用 `%I` 格式化占位符(`format()`函数)避免SQL注入 - 异常处理确保单表失败不影响其他表操作 - 详细的日志输出(`RAISE NOTICE/WARNING`) ### 执行流程示例: 假设 `ppm` 模式中有以下表: 1. `users`(有id列但无主键)→ 成功添加主键 2. `logs`(无id列)→ 不会被选中 3. `products`(已有主键)→ 不会被选中 4. `invalid_table`(id列有重复值)→ 触发警告 执行输出: ``` NOTICE: 已为表 users 添加id主键 WARNING: 无法为表 invalid_table 添加主键: could not create unique index "invalid_table_pkey" DETAIL: Key (id)=(1) is duplicated. ``` ### 使用场景: 1. 数据库重构时批量添加主键 2. 修复导入数据时缺失的主键约束 3. 规范化遗留数据库结构 ### 注意事项: 1. **权限要求**:执行用户需有`ALTER TABLE`权限 2. **表锁定**:添加主键会锁定表(生产环境需谨慎) 3. **数据一致性**:确保`id`列实际满足主键约束(唯一且非空) 4. **性能影响**:大表操作可能耗时较长 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值