我正在使用DB浏览器来尝试解决这个问题。我已经打开了Northwind.sqlite,在其中它显示了以下表格:
CREATE TABLE `Order Details` (
`OrderID` int,
`ProductID` int,
`UnitPrice` float ( 26 ),
`Quantity` int,
`Discount` float ( 13 ),
PRIMARY KEY(`OrderID`,`ProductID`)
);
但是,在Sql Server中,Northwind OrderID和ProductID是外键,而不是主键。这在SQLite中有何不同?如果是这样,关系如何运作?
谢谢 - 戴夫
答案 0 :(得分:1)
以上将创建一个没有FOREIGN键但有2个索引的表。
根据 rowid ,这是一个很大程度上隐藏的索引。
另一个,PRIMARY KEY(
订单ID ,
产品ID )
将是 OrderId 和 ProductID 组合的索引强>
关于rowid的一些事情(又名id)
INTEGER PRIMARY KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
定义列,则该列(每个表只能有1个此类列)是 rowid 的别名柱。
编码PRIMARY KEY(如果不在INTEGER列上,即不是 rowid的别名),则表示UNIQUE约束。它并不是说/检查聚集索引中的值或任何值是否存在于任何其他表中。
Order Details
表中,可以将值的任意组合设为null。编码FOREIGN KEY
引入了一个约束,即所引用的值必须存在于相应的表/列中。另外: -
通常,外键约束的父键是主键 父表的。如果它们不是主键,则为父键 键列必须共同使用UNIQUE约束或 有一个独特的索引。如果父键列具有UNIQUE索引, 然后该索引必须使用在中指定的归类序列 父表的CREATE TABLE语句。 SQLite Foreign Key Support
考虑到所有这些,您可能希望对Order Details
表进行一些更改: -
OrderID
和ProductID
列设为NOT NULL。OrderID
和ProductID
列添加FOREIGN KEY。所以也许你可以: -
CREATE TABLE `Order Details` (
`OrderID` int NOT NULL REFERENCES `Orders` (`OrderId`), -- ADDED NOT NULL and FKEY
`ProductID` int NOT NULL REFERENCES `Products`(`ProductId`) , -- ADDED NOT NULL and FKEY
`UnitPrice` float ( 26 ),
`Quantity` int,
`Discount` float ( 13 ),
PRIMARY KEY(`OrderID`,`ProductID`)
)
WITHOUT ROWID -- ADDED WITHOUT ROWID
;
或者,利用TABLE约束,您可以: -
CREATE TABLE `Order Details` (
`OrderID` int NOT NULL, -- ADDED NOT NULL
`ProductID` int NOT NULL, -- ADDED NOT NULL
`UnitPrice` float ( 26 ),
`Quantity` int,
`Discount` float ( 13 ),
PRIMARY KEY(`OrderID`,`ProductID`),
FOREIGN KEY (`OrderId`) REFERENCES `Orders`(`OrderId`), -- ADDED FKEY AS TABLE CONSTRAINT
FOREIGN KEY (`ProductID`) REFERENCES `Products`(`ProductID`) -- ADDED FKEY AS TABLE CONSTRAINT
)
WITHOUT ROWID -- ADDED WITHOUT ROWID
;
两者都有相同的结果,唯一的区别是定义了FOREIGN KEY约束。
以上两者均假设引用的表格为Orders
和Products
。