2015-10-15 89 views
0

怎樣才能實現概念上的想法:SQL需要多對多關係

「的文章至少有一個作者」

的參考似乎成爲自然循環,即ArticleAuthors指文章,但隨後的文章也必須參照ArticleAuthors ...

create domain Email varchar; 

create table Authors(
     authorEmail Email primary key, 
     authorName varchar not null 
     ); 

create table ArticleAuthors(
     article int references Article, 
     author varchar references Authors, 
     primary key (article, author) 
     ) 

create table Article(
     articleID int primary key, 
     articleAuthors ??? not null 
     ) 

即我把什麼代替???

+0

文章表沒有關於作者的任何字段。另外,如果作者更改了他的電子郵件地址,則說明您有問題。 –

+0

我的不好,作者是指「ArticleAuthors」 – beoliver

+0

@DanBracuk改變電子郵件地址的好處! – beoliver

回答

2

在SQL RDBMS中,通常不能同時在兩個表上插入。所以你不能有嚴格的實施。

您通常會定義一些存儲過程來處理整個事務。

所以Article不需要參考Authors

FUNCTION (articleID, authors[]) 

    if authors is null then exit function; 

    START TRANSACTION 

    INSERT INTO Article 

    INSERT INTO ArticleAuthors 

    END TRANSACTION 

而且你還需要一個DELETE on Authors觸發器,以確保你不從一文刪除所有的作者。

+0

但我的文章需要引用「ArticleAuthors」否?我有'???' – beoliver

+0

「的部分」在RDBMS中,你不能「這是不正確的。在SQL DBMS中,您通常不能但不意味着相同的限制必須應用於任何或所有關係數據庫管理系統。 – sqlvogel

+0

好的,我修好了。謝謝但是,也許你應該提供一個樣本,你可以做到這一點。 –

1

SQL DBMS通常不能在僅使用DDL的表之間實現這種「至少一個」約束。原則上,答案可能是使用CREATE ASSERTION並延遲約束檢查,直到兩個表都被更新。但是大多數SQL DBMS(我所知道的)都不會允許這樣做。這實際上是SQL的限制,因爲SQL不支持多表更新。