我有一个保存数据的表,其中一行需要存在于另一个表中.所以,我想要一个外键来保持参照完整性.
CREATE TABLE table1
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
AnotherID INT NOT NULL,
SomeData VARCHAR(100) NOT NULL
)
CREATE TABLE table2
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
AnotherID INT NOT NULL,
MoreData VARCHAR(30) NOT NULL,
CONSTRAINT fk_table2_table1 FOREIGN KEY (AnotherID) REFERENCES table1 (AnotherID)
)
Run Code Online (Sandbox Code Playgroud)
但是,正如你所看到的,表我是外键,列不是PK.有没有办法创建这个外键,或者更好的方法来维护这种引用完整性?
以下SQL语句是否会自动在Table1.Table1Column上创建索引,还是必须显式创建索引?
数据库引擎是SQL Server 2000
CREATE TABLE [Table1] (
. . .
CONSTRAINT [FK_Table1_Table2] FOREIGN KEY
(
[Table1Column]
) REFERENCES [Table2] (
[Table2ID]
)
)
Run Code Online (Sandbox Code Playgroud) 可能重复:
MySQL中的CHECK约束无效
我是学生,现在我必须弄清楚检查的意义.我们有一些代码:
CHECK (CHAR_LENGTH(PLZ) = 4)
Run Code Online (Sandbox Code Playgroud)
现在我必须弄清楚它到底在做什么.问题是我在互联网上找不到任何东西(或者我使用谷歌做了一些完全错误的事情).我创建了这个代码来测试它:
CREATE TABLE Test(
ID CHAR(4),
CHECK (CHAR_LENGTH(ID) = 4)
);
INSERT INTO Test(ID) VALUES ('12345');
Run Code Online (Sandbox Code Playgroud)
问题是我无法找到与CHECK约束删除行的任何区别.现在我问你?我使用与否的区别是什么.
我有一个sqlite数据库结构如下:
CREATE TABLE IF NOT EXISTS Patient
( PatientId INTEGER PRIMARY KEY AUTOINCREMENT );
CREATE TABLE IF NOT EXISTS Event
(
PatientId INTEGER REFERENCES Patient( PatientId ),
DateTime TEXT,
EventTypeCode TEXT,
PRIMARY KEY( PatientId, DateTime, EventTypeCode )
);
CREATE TABLE IF NOT EXISTS Reading
(
PatientId INTEGER REFERENCES Patient( PatientId ),
DateTime TEXT REFERENCES Event (DateTime),
EventTypeCode TEXT REFERENCES Event (EventTypeCode),
Value REAL,
PRIMARY KEY( PatientId, DateTime, EventTypeCode )
);
Run Code Online (Sandbox Code Playgroud)
我插入患有Id#1的患者
然后我跑:
INSERT INTO Event (PatientId, DateTime, EventTypeCode) VALUES (1, …Run Code Online (Sandbox Code Playgroud) 我试图在表A上创建约束,以检查表B中是否存在一组记录。我可以使用外键,但是问题是表B中的数据不唯一。
有没有一种方法可以创建这样的约束而不创建触发器?
编辑:我不能更改表B的结构。