SQL如何使用取决于同一表中不同列的值的值更新列

时间:2014-03-04 21:12:04

标签: sql oracle

我有一个包含2个日期列的表,open_date和close_date。当我插入一个新行时,close_date可以为null。但是将来我会想要更新close_date,我想确保close_date比open_date更大? 感谢名单

我正在使用oracle ......

3 个答案:

答案 0 :(得分:1)

这样的check constraint会问你问:

ALTER TABLE YourTable ADD CONSTRAINT CK_open_date_before_close_date
   CHECK (open_date < close_date);

这将拒绝将表更新为违反条件的状态的任何事务。例如,如果您更新了5行但只有其中一行违反了约束,则整个更新将失败。

此外,对于开放式结束日期,我建议您使用NULL的标记值,而不是99991231。这有很多原因,其中最重要的是查询性能(因此您可以在不需要OR IS NULL子句的情况下执行简单的不等式语句)。然后,您可以另外创建列NOT NULL并简化上述检查条件。这也会对前端应用程序代码产生积极影响。

<强>更新

检查约束中不需要OR close_date IS NULL,因为如果close_dateNULL,整个表达式将被评估为NULL,这不会违反CHECK约束。

答案 1 :(得分:1)

您可以添加检查约束以确保Close_date大于Open_Date,

ALTER TABLE Table_Name
ADD CONSTRAINT ck_Con_Name CHECK (Close_date  > Open_Date)

为了确保为Close_Date列提供一个值而不是为null,请将列设置为NON-NULABLE。

为此,您需要确保该列中没有任何NULL值。将列更新为某些defualt值。然后改变表定义像这样......

ALTER TABLE Table_Name
ALTER COLUMN Close_date  DATETIME NOT NULL;

答案 2 :(得分:-1)

您可能需要CHECK约束。

请参阅link