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!
Это отвечает на ваш вопрос # 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);
И это отвечает на ваш вопрос # 1: эта команда «REFERENCES» создаст ограничение внешнего ключа, которое заставит все записи в CUSTOMER.STATE_CODE иметь соответствующую запись в таблице STATE_CODE. После настройки, если кто-то попробует это:
INSERT INTO CUSTOMER(CUST_ID,CUST_NAME,CUST_STATE)
VALUES(9000,'Martians',74837483748);
Тогда они получат сообщение об ошибке, и эти ошибочные данные никогда не будут введены (если, конечно, у вас действительно не было состояния с кодом 74837483748).