【数据库】CHECK是什么

嘿,我最近在做一个数据库项目,遇到了 CHECK 约束的事情。
事实上,CHECK约束类似于在​​数据库中安装一个小守卫,负责检查数据是否遵循你指定的路径。
例如,我曾经在一家公司负责数据库管理。
当时有一张员工桌。
我在“资历”和“员工年龄”字段中添加了 CHECK 限制,以确保资历不能为负数,并且员工必须年满 1 8 岁。
这就像说,“嘿,你,你的工龄必须是正常的,你的年龄必须符合要求,否则你不会被包含在表中。

再举一个例子,我向项目表添加了一个约束,要求结束日期必须晚于开始日期。
这就像说,“项目开始得早,结束得晚,所以有一个很好的解释。

但是,要删除 CHECK 约束,您必须使用 ALTERTABLE 语句,并且必须小心操作,以避免意外删除有用的约束。

另外,我之前在products表中创建了一个复杂的条件,要求折扣值在0到1 00之间。
只有is_discounted为true,折扣才能大于0。
这就像在说:“折扣必须在指定范围内,并且取决于你是否真正收到折扣。

但说实话,使用CHECK约束时需要注意性能问题,尤其是数据量较大时。
另外,不同MySQL版本对这个东西的支持是不一样的,所以需要根据实际情况来操作。

总的来说,如果使用正确,CHECK约束可以帮助简化数据验证逻辑,减轻应用程序级代码的负担,并保证数据质量和一致性。
不过,使用时一定要小心,不要让数据库中的数据变得混乱。

使用SQL在Oracle数据库中添加日期时出现年份错误:原因与解决方案

由于 NLS_DATE_FORMAT,两位数年份被错误地计算为 2 08 2
NLS_DATE_FORMAT默认为“RR”,如果遇到“8 2 ”,就会被当成1 9 8 2 ,这是非常具有欺骗性的。

直接使用SYSDATE添加天数更容易。
例如: 平方米 更新CUS_LOGS 设置开始日期 = TRUNC( 系统日期) + 3 , END_DATE = TRUNC(系统数据) + 2 1 9 2 1 WHERE CUS_ID = '9 b9 0cb8 1 7 5 ba0ca6 01 7 5 ba1 2 d8 7 1 1 006 ';
TRUNC(SYSDATE) 删除时间并从零开始计数。

不要使用 TO_DATE() 进行日期计算。
如有必要,请使用四位数年份格式: 平方米 更新CUS_LOGS SET END_DATE = TO_DATE('08 -NOV-2 08 2 ', 'DD-MON-YYYY') WHERE CUS_ID = '...';
但是 NLS_DATE_FORMAT 可能仍然存在问题。

要添加和减去月份和年份,请使用 ADD_MONTHS()。
例如: 平方米 更新CUS_LOGS 设置结束日期 = ADD_MONTHS(TRUNC(SYSDATE), 6 0 1 2 ) + 3 WHERE CUS_ID = '...';
添加 6 0 年并乘以 1 2
间隔也有效,但您必须自己处理闰年。
例如: 平方米 更新CUS_LOGS SET END_DATE = TRUNC(SYSDATE) + INTERVAL '6 0' 年 WHERE CUS_ID = '...';
您应该注意如何计算 2 月 2 9 日加 1 年。

暂时更改 NLS_DATE_FORMAT 是可以的,但不要使用: 平方米 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
不要在生产环境中依赖此技巧。

检查结果: 平方米 选择 SYSTEM_DATE 作为 CURRENT_DATE, SYSTEM_DATE + 2 1 9 2 1 作为 FUTURE_DATE, ADD_MONTHS(SYSDATE, 7 2 0) AS FUTURE_DATE_MONTHS FROM DUAL;
检查加法是否正确。

记住:不要隐式转换,另外使用SYSDATE、TRUNC、ADD_MONTHS。
不要编码“8 2 ”,不要使用“RR”格式。

对于这个问题你怎么看?

数据库mysql迁移达梦有异常怎么解决

数据库迁移是一项非常困难的任务。
上周有客户询问MySQL在传输梦想(DM)时老是报错。
让我告诉你我当时是如何帮助他理解这一点的。

上周,一位客户告诉我,他们已经将 MySQL 迁移到 DM,他们已经为此工作了很长时间,但他们的表不断报告错误。
当我查看日志时,发现了很多问题。

第一个错误是“超出列长度”错误。
我先关掉DTS(数据迁移工具),让他们再次运行表结构迁移。
他让我“想一想”为什么。
MySQL的VARCHAR(2 5 5 )可能没问题,但大盟可能有更严格的字符长度控制。
您可以通过先停止表结构来重置DTS中的字段长度。
它可能会起作用。
我们发现这非常有效,可能是因为到目前为止我们还没有在DTS中单独设置字段长度。

第二个问题是乱码。
这真是令人头疼。
我让他仔细看两本手册,他的MySQL版本使用什么字符集,对大盟有什么要求。
接下来,我将所有迁移参数一一整理,确保没有出入。
然后我尝试了一个叫做SQLark的工具。
我先检查环境,发现字符集搞反了。
当我改了之后,再次运行,乱码就解决了。

还有一个数据类型不匹配的问题。
例如,MySQL中的某些浮点类型可能与Damen不匹配。
我让他逐个字段比较,看看是 int 还是 varchar,以及长度是否正确。
我有一个表,其字段是 MySQL 日期时间。
大梦似乎并不支持这一点。
最后他改成时间戳就过去了。

SQL 语法的不兼容性也是一个障碍。
有一个存储过程使用 MySQL 特定的字符串函数,Dameng 记得立刻就感到困惑。
我让他们反汇编存储过程并使用大盟支持的功能重写它。
这很艰难,但总比失去整块手表要好。

最后是各种错误报告。
例如,如果您中途移动表,您将收到一条消息,指出违反了唯一约束。
我让他先清空目标表,然后重新导入数据。
果然,事情解决了。
这可能是由于源数据库中的重复数据未正确处理所致。
还有一种日期格式。
源数据库为 YYYY-MM-DD。
达门可能需要更强硬。
进行更改并迁移后,不会报告任何错误。

无论如何,数据库迁移都不是点击几下就能完成的简单任务。
注意各种细节,调整参数,改变类型,写SQL需要重写。
如果您只是使用DTS进行自动迁移,其默认设置可能并不完美。
应根据实际错误报告逐步修复它。
在某些情况下,移动数百 MB 的表可能需要很长时间。
很烦人吗?无论如何,这取决于你自己想办法。
没有现成的通用脚本,每个库的情况都不同。