我正在爲我的大學創建一個Delphi應用程序,現在我被卡住了。該程序是關於數據庫的,我使用FireBird 2.1作爲數據庫服務器。我的數據庫和應用程序是關於Linux發行版的。SQL和外鍵:如何正確鏈接這兩個表?
我想鏈接我的Firebird數據庫中的兩個表。第一個表格提供有關分配的信息,第二個表格提供有關桌面環境的信息。有兩個字段我想要鏈接:分佈表中的默認桌面環境和DEs表中的桌面環境名稱。
一個發行版只能有一個默認的桌面環境,它位於安裝光盤上(或者在安裝期間由用戶選擇)。在DE表中,有一個唯一的字段,描述了DE的名稱,所以它應該鏈接到分佈的默認DE字段。
但是,一個DE可以用作默認DE 多個分佈,這是衝突所在:發佈表中的默認DE字段必須是唯一的,但事實並非如此。我試圖達到的是參照完整性:使DEs表依賴。
另外,我試着創建第三個表,它只包含DISTR_NAME和ENV_NAME字段,但是我唯一想到的就是使這個第三個表依賴於DISTROS和DES表,但是這是不對的。 DES表應該依賴於DISTROS表,我不知道該怎麼做。所以任何幫助將不勝感激!如何正確鏈接這兩個表?
所以我創建了這兩個表:
CREATE TABLE DISTROS (
DISTR_NAME VARCHAR(50) NOT NULL,
ARCHITECT VARCHAR(50) NOT NULL,
DEFAULT_DE VARCHAR(50) NOT NULL,
LASTSTABLE VARCHAR(50) NOT NULL,
PACKMANAGE VARCHAR(50) NOT NULL
);
和
CREATE TABLE DES (
ENV_NAME VARCHAR(50) NOT NULL,
USED_LANG VARCHAR(50) NOT NULL,
LASTSTABLE VARCHAR(50) NOT NULL,
SUPPORT_3D SMALLINT,
FILEMANAGE VARCHAR(50) NOT NULL
);
ALTER TABLE DES ADD CONSTRAINT PK_DES PRIMARY KEY (ENV_NAME);
ALTER TABLE DES
ADD CONSTRAINT FK_DES_1 FOREIGN KEY (ENV_NAME) REFERENCES DISTROS (DE);
我無法弄清楚如何解決這個問題:分佈表必須是父表,和DEs表必須是子表。分配表應具有主鍵(DISTR_NAME字段),並且DE表應具有外鍵(ENV_NAME字段,與分配表的DE字段鏈接)。
但我不能那樣做,因爲SQL要求分發表的DE字段是主鍵。主鍵必須是唯一的。但是,一個桌面環境可以被許多Linux發行版使用,所以這個字段不可能是唯一的。而我只是不知道如何正確鏈接這兩個表。
我刪除了Delphi和IBExpert標籤,因爲這個問題與使用的編程語言或數據庫管理軟件完全無關。這完全是一個Firebird SQL問題。 – 2013-02-14 00:45:06
我認爲你的外鍵應該從'DISTROS'到'DES',而不是相反。 – 2013-02-14 09:21:19
Mark Rotteveel,是的!是!非常感謝你!謝謝!它幫助,現在一切正常!謝謝! – ArchAlessus 2013-02-14 10:40:00