在SQL Server 2008中是否可以創建一個使用兩列同時是主鍵和外鍵的表?如果是,那麼這樣的代碼將如何?我搜索了一無所獲。主鍵和外鍵同時出現
回答
當然,沒問題:
CREATE TABLE dbo.[User]
(
Id int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(1024) NOT NULL
);
CREATE TABLE [Group]
(
Id int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(1024) NOT NULL
);
CREATE TABLE [UserToGroup]
(
UserId int NOT NULL,
GroupId int NOT NULL,
PRIMARY KEY CLUSTERED (UserId, GroupId),
FOREIGN KEY (UserId) REFERENCES [User] (Id) ON UPDATE NO ACTION ON DELETE CASCADE,
FOREIGN KEY (GroupId) REFERENCES [Group] (Id) ON UPDATE NO ACTION ON DELETE CASCADE
);
這是很常用的許多一對多的關係進行建模。
就像FYI一樣,在UserToGroup表的'information_schema.key_column_usage'中,'UserID'和'GroupID'都會返回兩行,一個用於PK,一個用於FK ... [參考...](http://stackoverflow.com/a/15622288/623952) – 2013-03-25 18:53:21
這些是完全不同的構造。
A 主鍵用於強制執行表內的唯一性,並且是某個記錄的唯一標識符。
A 外鍵用於引用完整性,以確保值存在於另一個表中。
外鍵需要引用另一個表中的主鍵。
如果你想擁有一個也是唯一的外鍵,你可以創建一個FK約束,併爲該字段添加一個唯一索引/約束。
爲便於參考,SQL Server允許FK引用UNIQUE CONSTRAINT
以及PRIMARY KEY
字段。
只是一個快速的注意 - 從微軟的網頁(http://msdn.microsoft.com/en-us/library/ms189049.aspx)...
「外鍵約束不必只鏈接到另一個表中的主鍵約束;它也可以被定義爲參考另一個表中的UNIQUE約束的列「。
不經常使用,但在某些情況下很有用。
這可能不是一個好主意,因爲你經常想在表中允許重複的外鍵。即使你現在沒有,將來也可能,最好不要這樣做。請參閱Is it fine to have foreign key as primary key?
爲什麼不呢?就像你所說的鏈接一樣,它說有一些情況像是一對一的關係,在這可能是必要的 – 2015-12-16 01:57:39
我沒有說這總是一個壞主意;)你是對的,可能會有例外,它會永遠是1:1。我的評論在這裏讓人們爲他們思考正確的選擇。 – thebiggestlebowski 2016-08-17 23:22:00
- 1. SQL更新主鍵和外鍵同時
- 2. 主鍵和外鍵
- 3. 主鍵和外鍵
- 4. 主鍵和外鍵?
- 5. 外鍵和主鍵
- 6. 同一表中的主鍵和外鍵
- 7. 外鍵相同的主鍵
- 8. 嘗試創建外鍵時出現主鍵錯誤
- 9. ScalaQuery多主鍵和外鍵
- 10. 主鍵和外鍵2
- 11. SQL主鍵和外鍵
- 12. 主鍵和外鍵衝突
- 13. ORA-01735主鍵和外鍵
- 14. 外鍵和主鍵錯誤
- 15. 同時插入帶有主鍵和外鍵的表格
- 16. EF核心:同時使用ID作爲主鍵和外鍵
- 17. Echo模式,同時包含主鍵和外鍵
- 18. 如何使這將是在同一時間外鍵和主鍵
- 19. MySQL 2外鍵到相同的主鍵
- 20. 多個外鍵同主鍵表
- 21. 主鍵VS外鍵
- 22. 外鍵和主鍵Postgres和索引
- 23. 如何從主表鍵和外鍵在同一個表中刪除主鍵。
- 24. 插入主鍵時插入外鍵?
- 25. 有主鍵和外鍵的drop table
- 26. SQL更改語句和外鍵/主鍵
- 27. SQL命令,主鍵和外鍵
- 28. 複合主鍵和外鍵jpa
- 29. 加入聲明/主鍵和外鍵
- 30. 需要主鍵和外鍵的幫助
您的意思是創建表的SQL是什麼樣子的? – 2012-01-12 21:53:24
這是ORM框架上的一個非常常見的情況,它通過執行按類表映射來支持繼承映射。例如,如果一個類B繼承自一個類A,並且這些類被映射到table_a和table_b,那麼通常B的實例在table_a和table_b上具有相同的id,並且table_b在它的id列上爲table_a定義了一個FK ID列。試着使用SQLServer Management Studio來定義FK和PK。 – 2015-06-29 18:26:17