Dev*_*she 5 sql oracle lookup-tables
在我的数据库中,许多表都有"State"字段,表示该特定实体所处的状态.我被告知我们应该使用Lookup表来处理这类事情,但我不确定其确切的机制.有人可以澄清这些观点吗?
如何保持诚信?(即如何确保只有状态表中的值进入其他表?)
状态名是否进入其他表,或者状态表中的状态ID是否进入其他表?
1 - 使用所谓的FOREIGN KEY约束维护完整性.一个合理的场景可能会让你做这两个表:
Table Name: STATE_CODE
ID DESCRIPTION
=================
1 Alabama
2 Arkansas
...
50 Wyoming
Table Name: CUSTOMER
=====================
CUST_ID CUST_NAME CUST_STATE
100 AAA Company 1 --they are in Alabama!
200 ZZZ Company 50 --they are in Wyoming!
Run Code Online (Sandbox Code Playgroud)
这回答了你的问题#2:状态代码,而不是全名,在本例中的CUSTOMER表中.
在现有布局上强加这种结构的典型脚本如下:
--first, create the lookup table
CREATE TABLE STATE_CODE(
ID INTEGER NOT NULL
,DESCRIPTION VARCHAR(100) NOT NULL
,PRIMARY KEY(ID)
);
--now add a reference to the lookup table inside your existing table
--the REFERENCES part will **force** entries
--to have a matching entry in STATE_CODE
ALTER TABLE CUSTOMER ADD STATE_CODE_ID REFERENCES STATE_CODE(ID);
Run Code Online (Sandbox Code Playgroud)
这回答了您的问题#1:"REFERENCES"命令将创建一个外键约束,该约束将强制CUSTOMER.STATE_CODE中的所有条目在STATE_CODE表中具有相应的条目.设置完成后,如果有人试试这个:
INSERT INTO CUSTOMER(CUST_ID,CUST_NAME,CUST_STATE)
VALUES(9000,'Martians',74837483748);
Run Code Online (Sandbox Code Playgroud)
然后他们会得到一条错误信息,并且永远不会输入有缺陷的数据(当然,除非您确实拥有代码为74837483748的状态).