CREATE table orders (
custNum INT NOT NULL CHECK(custNum >= 0 AND custNum <= 999999),
prodNum INT FOREIGN KEY REFERENCES product(prodNum),
date DATE NOT NULL DATE_FORMAT(date, '%d-%m-%Y') CHECK(date >= '01-01-1993'),
qty INT CHECK(qty >= 0 AND qty <= 100000),
PRIMARY KEY (custNum, prodNum, date)
);
从我的
中可以看到date DATE NOT NULL DATE_FORMAT(date, '%d-%m-%Y') CHECK(date >= '01-01-1993'),
我要做的是确保当我输入记录时,它会将格式检查为DD-MM-YYYY
,并且晚于01-01-1993
。但是,我发现所有日期格式都主要用于SELECT
语句,这是我不想要的。我希望日期列中的记录采用我指定的格式。你是怎么做到的?
谢谢,我感谢任何帮助。我正在学习SQL和约束。我是初学者,所以我希望尽可能简单(最好是我的一行声明的解决方案),以便我能更好地理解。
编辑:嗨,我实际上计划在mySQL / MariaDB上进行,但是有一个CHECK约束错误(?)所以我实际上使用的是Microsoft SQL Management Studio。如果它可以在Microsoft SQL Management Studio上运行,我会很感激。答案 0 :(得分:0)
你在提问时遇到两个问题。第一个问题是代表性。更改选择中显示日期的方式。要解决此问题,请运行
dbcc useroptions
检查您当前的设置。第一个问题的解决方案是
Ø更改操作系统设置。
Ø将服务器设置更改为英式英语。
Ø现在创建一个新用户并使用dbcc useroptions
Ø现在您将看到该选项已更改。
第二个问题是check
约束。如果您正确更改了dateformat
,则当前check
约束可能会有效,但我建议您确保使用正确的dateformat。你需要像
CHECK (REGISTRATION_DATE > TO_DATE('01-01-1993', 'dd-mm-yyyy'))
了解更多here。
要实现这一目标,您需要modify the check constraint:
在对象资源管理器中,右键单击包含该检查的表 约束并选择设计。
在Table Designer菜单上,单击Check Constraints ....。
在“检查约束”对话框中的“选中检查约束”下, 选择您要编辑的约束。
完成一项行动
答案 1 :(得分:0)
摘自Bad habits to kick : mis-handling date / range queries - Aaron Bertrand:
与YYYY-MM-DD相反,YYYYMMDD永远不会破裂。如果您决定对日期字符串文字使用任何其他格式,至少对于DATETIME和SMALLDATETIME类型,如果用户具有不同的会话设置,或者应将应用程序移动到具有不同的服务器,则会让您自己处于错误或不正确的数据中设置。
在SQL Server 2008中,新类型与用户或计算机设置更加隔离;仍然,我使用YYYYMMDD来保持一致性并且安全。
我发现你没有使用YYYY-MM-DD
,但YYYYMMDD
不会中断的事实仍然适用。
以下是原始create table
语句的重新格式,其YYYYMMDD
值为
create table orders (
custnum int not null
, prodnum int not null
, [date] date not null
, qty int not null
, constraint [pk_orders] primary key clustered (custnum, prodnum, date)
, constraint [fk_orders_prodnum] foreign key (prodnum)
references product(prodnum)
, constraint [chk_orders_custum_gte_0_lte_999999]
check (custnum >= 0 and custnum <= 999999)
, constraint [chk_orders_date_gt_19930101]
check ([date]>'19930101')
, constraint [chk_orders_qty_gt_0_lt_1000000]
check (qty >= 0 and qty <= 100000)
);
进一步阅读: