我正在嘗試設定 3NF 表并插入資料,但不斷收到“唯一約束失敗”錯誤。也許我錯誤地完成了 1NF-3NF 轉換,或者錯誤地識別了外鍵/主鍵。
插入方法:
INSERT INTO Employee VALUES ('16', 'Smith'), ('33', 'Smith'),('30', 'Jenny'), ('16', 'Smith')
我希望Employee表格看起來像什么(16-SMITH 應該重復):
| EMP_ID | EMP_FNAME |
|---|---|
| 16 | 史密斯 |
| 33 | 史密斯 |
| 30 | 珍妮 |
| 16 | 史密斯 |
我的桌子:
CREATE TABLE "Employee" (
"EMP_ID" INTEGER,
"EMP_FNAME" TEXT,
PRIMARY KEY("EMP_ID")
);
CREATE TABLE "Project" (
"PROJ_ID" INTEGER,
"JOB_TYPE" INTEGER,
"EMP_ID" INTEGER,
PRIMARY KEY("PROJ_ID","EMP_ID")
);
CREATE TABLE "HOURLY PAY" (
"JOB_TYPE" INTEGER,
"HOUR_RATE" INTEGER,
PRIMARY KEY("JOB_TYPE"),
FOREIGN KEY("JOB_TYPE") REFERENCES "Project"("JOB_TYPE")
);
提供的表 I 必須從 1NF->3NF 轉換:
| PROJ_ID | PROJ_NAME | EMP_ID | EMP_FNAME | 作業型別 | HOUR_RATE |
|---|---|---|---|---|---|
| 1135 | 祖魯語 | 16 | 史密斯 | H25 | 20 |
| 1135 | 祖魯語 | 33 | 史密斯 | H27 | 20 |
| 1188 | 航海者 | 30 | 珍妮 | H26 | 30 |
| 1188 | 航海者 | 16 | 史密斯 | H25 | 20 |
uj5u.com熱心網友回復:
因為EMP_ID是主鍵。它必須是獨一無二的。主鍵允許您唯一標識一條記錄。假設您可以插入 Id 16 兩次,然后想洗掉這兩條記錄之一,您將如何完成它?DELETE FROM Employee WHERE EMP_ID = 16將洗掉它們。
這就是標準化的關鍵。每個物體都必須是唯一的,資訊不得重復。
我想你還需要一張桌子。您需要一個Project具有唯一專案 ID 和專案名稱的表。然后你需要一個 Project 和 Employee 之間的聯結表。我們可以稱之為“任務”。它必須具有您現在稱為“專案”的表的結構。
CREATE TABLE Employee (
EMP_ID INTEGER,
EMP_FNAME TEXT,
PRIMARY KEY (EMP_ID)
);
CREATE TABLE Project (
PROJ_ID INTEGER,
PROJ_NAME TEXT,
PRIMARY KEY (PROJ_ID)
);
CREATE TABLE JobType (
JOB_TYPE TEXT,
HOUR_RATE INTEGER,
PRIMARY KEY (JOB_TYPE)
);
CREATE TABLE Assignment (
PROJ_ID INTEGER,
EMP_ID INTEGER,
JOB_TYPE TEXT,
PRIMARY KEY (PROJ_ID, EMP_ID),
FOREIGN KEY (PROJ_ID) REFERENCES Project (PROJ_ID),
FOREIGN KEY (EMP_ID) REFERENCES Employee (EMP_ID),
FOREIGN KEY (JOB_TYPE) REFERENCES JobType (JOB_TYPE)
);
員工、專案和作業型別是獨一無二的。在“分配”中,員工/專案配對是獨一無二的。
INSERT INTO Employee (EMP_ID, EMP_FNAME) VALUES
(16, 'Smith'),
(30, 'Jenny'),
(33, 'Smith');
INSERT INTO Project (PROJ_ID, PROJ_NAME) VALUES
(1135, 'Zulu'),
(1188, 'Voyager');
INSERT INTO JobType (JOB_TYPE, HOUR_RATE) VALUES
('H25', 20),
('H26', 30),
('H27', 20);
INSERT INTO Assignment (PROJ_ID, EMP_ID, JOB_TYPE) VALUES
(1135, 16, 'H25'), <== Smith 16
(1135, 33, 'H27'),
(1188, 30, 'H26'),
(1188, 16, 'H25'); <== Smith 16 again, but assigned to a different project.
人們必須考慮為作業型別分配一個中性數字主鍵是否更好。作業代碼(如'H25')將是一個單獨的列。有意義的主鍵可能會出現問題。如果有人想為作業型別引入另一種命名方案,當名稱為主鍵時,這很難實作。
然后,您可以使用查詢重新創建原始表中包含的資訊
SELECT
a.PROJ_ID,
p.PROJ_NAME,
a.EMP_ID,
e.EMP_FNAME,
a.JOB_TYPE,
j.HOUR_RATE
FROM
Assignemnt a
INNER JOIN Employee e ON a.EMP_ID = e.EMP_ID
INNER JOIN Project p ON a.PROJ_ID = p.PROJ_ID
INNER JOIN JobType j ON a.JOB_TYPE = j.JOB_TYPE
ORDER BY
a.PROJ_ID,
e.EMP_FNAME
見:http ://sqlfiddle.com/#!5/3dcdb/3/0
uj5u.com熱心網友回復:
插入員工價值觀('16', 'Smith') , ('33', 'Smith'),('30', 'Jenny'), ('16', 'Smith')
你有兩個 Smith,他們的 id 都是 16。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/525573.html
標籤:sqlite
上一篇:如何用Null填充缺失的數字?
