1

テーブル スキーマは次のとおりです。

create table EMPLOYEE
(fname /* Employee's first name */ varchar(15) not null,
init /* Employee's middle initial */ char(1),
lname /* Employee's last name */ varchar(15) not null,
IRD /* Employee's IRD number */ varchar(10) not null primary key, sex /* Employee's sex */ char(1)
constraint check_sex check (sex in ('f','m','F','M')),
bdate /* Employee's birthdate */ date,
office /* Employee's office */ varchar(5),
reg_org /* The number of the registration office the employee works for */
varchar(10),
sdate /* Starting date in the organization */ date);

次に、制約を追加するのが理にかなっていると思います

alter table employee
add constraint ck_date check (sdate >= bate);

しかし、それは私にエラーを与えます

add constraint ck_date check (sdate >= bdate)
               *
ERROR at line 2:
ORA-02293: cannot validate (SYSTEM.CK_DATE) - check constraint violated

私がどこで間違っているか知っている人はいますか?


2 つの列のデータを更新する

SQL>従業員からbdate、sdateを選択します。

BDATE     SDATE
--------- ---------
21-JAN-58 22-FEB-10
21-MAY-70 17-MAR-09
09-NOV-47 12-MAY-08
10-OCT-53 15-JUN-09
01-OCT-56 01-OCT-05

SQL> select to_char(bdate, 'yyyy-mm-dd') as bdate, to_char(sdate,'yyyy-mm-dd') from employee;

BDATE      TO_CHAR(SD
---------- ----------
1958-01-21 2010-02-22
1970-05-21 2009-03-17
2047-11-09 2008-05-12
1953-10-10 2009-06-15
1956-10-01 2005-10-01


4

1 に答える 1

1

問題は、おそらくテーブルに既にいくつかのデータがあり、その制約を作成しようとすると、データベースがテーブルに既に格納されている値を検証しようとすることです。以外のものもあるようsdateです。<bdate

作成中に制約を検証したくない場合は、次を使用します。

ALTER TABLE employee ADD CONSTRAINT ck_date CHECK (sdate >= bdate) NOVALIDATE;

編集

あなたのデータで私ができるように、たとえば、21-JAN-58そして22-FEB-10- は、そして-であるBDATEと思われますよね? 万が一 RR 形式を使用して年を指定した場合、年が 50 未満の場合は年ごとに取得され、値が大きい場合は と の間の年が取得されます。これを確認してください。21-JAN-1958sdate22-FEB-2010200019501999

SELECT TO_CHAR(TO_DATE('01-01-49', 'DD-MM-RR'), 'DD-MM-YYYY') AS year_in_2000,
       TO_CHAR(TO_DATE('01-01-50', 'DD-MM-RR'), 'DD-MM-YYYY') AS year_before_2000 FROM dual;

出力:

YEAR_IN_2000 YEAR_BEFORE_2000
------------ ----------------
2049 年 1 月 1 日 1950 年 1 月 1 日  
于 2013-11-05T08:52:27.417 に答える