数据库-列的完整性约束-not null 非空约束

# 列的完整性约束not null 非空约束

 create  database NotNullStudy;
 use NotNullStudy;

 #很多情况下是可以为空的 比如说人出生没有名字 或者说一开始就已经想好了  就以这个名字 但你要说必须不能为空的好像只有蛋类 不能为空的必备条件 或者说确定下来的事情都不能为空
  create table juese( id int primary key ,name varchar(64) ,ReferenceName varchar(128) not null );
insert  into  juese values(1,'温迪','巴巴托斯,提瓦特尘世七执政之一,自由国度.蒙德 最懂自由的人');

insert into juese Values(2,'钟离','摩拉克斯,提瓦特尘世七执政之一,商业,契约国度,璃月 最懂契约的人  引用词:终止一切契约的契约');
insert into juese Values(3,'雷电将军','巴尔泽布,提瓦特尘世七执政之一,追逐于永恒国度,稻妻  永恒代价:停下来 ,但国家需要运转 锁国令只会 退步');

insert into juese Values(4,'纳西妲','布耶尔,提瓦特尘世七执政之一,智慧国度,须妳 过去初代智慧之神 创造虚空终端 制造一切美好的梦境');

select *from juese;
# 在 juese 表中存在一个名为 ReferenceName 的字段,该字段没有设置默认值
insert  into  juese (id ,name)values(5,'芙宁娜');
<think> 我们正在尝试在达梦数据库中添加主键约束,但遇到了违反"data-time"约束的错误。这意味着在添加主键时,系统发现该存在NULL值,而主键不允许为NULL。 ### 错误原因分析 1. **主键要求**:主键必须满足`NOT NULL`且唯一。若中存在NULL值,添加主键会失败。 2. **错误提示**:报错信息通常为`-2650: 主键的不允许NULL值`或类似内容。 ### 解决步骤 #### 1. 检查NULL值 执行SQL查询确认`data-time`NULL值情况: ```sql SELECT COUNT(*) FROM 表名 WHERE "data-time" IS NULL; ``` 若结果大于0,说明存在NULL值。 #### 2. 处理NULL值 根据业务需求选择以下方案: - **方案1:清理NULL值**(若无业务意义) ```sql DELETE FROM 表名 WHERE "data-time" IS NULL; ``` - **方案2:填充NULL值**(如默认值) ```sql UPDATE 表名 SET "data-time" = SYSDATE WHERE "data-time" IS NULL; -- 示例:用当前时间填充 ``` #### 3. 设置约束未定义`NOT NULL`,需先修改属性: ```sql ALTER TABLE 表名 MODIFY "data-time" NOT NULL; ``` > **注意**:需确保无NULL值后才能执行成功。 #### 4. 重新添加主键 处理完NULL值后,再次尝试添加主键: ```sql ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY ("data-time"); ``` ### 完整示例 假设表名为`log_data`,需将`data-time`设为主键: ```sql -- 1. 检查NULL值 SELECT COUNT(*) FROM log_data WHERE "data-time" IS NULL; -- 2. 填充NULL值(示例) UPDATE log_data SET "data-time" = '1970-01-01 00:00:00' WHERE "data-time" IS NULL; -- 3. 设置约束 ALTER TABLE log_data MODIFY "data-time" NOT NULL; -- 4. 添加主键 ALTER TABLE log_data ADD CONSTRAINT pk_log_time PRIMARY KEY ("data-time"); ``` ### 预防措施 - **建表时定义主键**:避免后期添加时数据问题。 - **数据校验**:应用层或触发器确保主键NULL- **使用默认值**:建表时设置`DEFAULT`减少NULL风险。 §§相关问题§§ 1. 达梦数据库中如何查询表中某是否存在NULL值? 2. 除删除或填充外,处理主键NULL值还有哪些方法? 3. 在达梦数据库中,如何修改的默认值以规避NULL问题? 4. 添加主键时出现唯一性冲突错误(如重复值)应如何解决? 5. 达梦数据库中,如何为已存在数据的表同时添加多个约束(如和主键)? </think>在达梦数据库中添加主键时出现"违反data-time约束"错误,表明目标存在值(NULL)或未正确设置约束。以下是详细解决方案: ### 错误原因分析 1. **存在NULL值**:主键不允许NULL值,但"data-time"中存在数据 2. **未显式设置NOT NULL**:即使业务数据无NULL,若未定义NOT NULL约束,添加主键仍会报错 3. **数据校验失败**:添加主键时会自动验证数据完整性值导致验证失败 ### 解决步骤 #### 1. 检查并处理现有NULL值 ```sql -- 查询NULL值数量 SELECT COUNT(*) FROM 表名 WHERE "data-time" IS NULL; -- 方案1:删除NULL值记录(谨慎使用) DELETE FROM 表名 WHERE "data-time" IS NULL; -- 方案2:填充默认值(推荐) UPDATE 表名 SET "data-time" = SYSDATE WHERE "data-time" IS NULL; -- 使用当前时间 -- 或 UPDATE 表名 SET "data-time" = '1970-01-01' WHERE "data-time" IS NULL; -- 自定义默认值 ``` #### 2. 显式添加NOT NULL约束 ```sql -- 添加约束(必须步骤) ALTER TABLE 表名 MODIFY "data-time" NOT NULL; -- 验证约束生效 SELECT nullable FROM user_tab_columns WHERE table_name = '表名' AND column_name = 'data-time'; -- 返回'NO'表示成功 ``` #### 3. 重新添加主键约束 ```sql ALTER TABLE 表名 ADD CONSTRAINT pk_name PRIMARY KEY ("data-time"); ``` ### 特殊情况处理 1. **批量处理大表**:对海量数据使用分批次更新 ```sql BEGIN FOR i IN 1..100 LOOP -- 分100批处理 UPDATE 表名 SET "data-time" = SYSDATE WHERE "data-time" IS NULL AND ROWNUM <= 10000; COMMIT; END LOOP; END; ``` 2. **业务不允许修改NULL值**:创建函数索引替代主键 ```sql -- 1. 创建唯一函数索引 CREATE UNIQUE INDEX idx_data_time ON 表名(NVL("data-time", SYSDATE)); -- 2. 添加虚拟主键约束 ALTER TABLE 表名 ADD CONSTRAINT pk_virtual PRIMARY KEY ("data-time") USING INDEX idx_data_time; ``` ### 预防措施 1. **建表时定义约束**: ```sql CREATE TABLE 表名 ( "data-time" DATETIME NOT NULL PRIMARY KEY, ... ); ``` 2. **应用层校验**:在数据写入前验证 3. **默认值设置**: ```sql ALTER TABLE 表名 MODIFY "data-time" DEFAULT SYSDATE NOT NULL; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值