Sql 表之间的关系
所以我想做的是,如果我执行下面的查询Sql 表之间的关系,sql,Sql,所以我想做的是,如果我执行下面的查询 Person Table ------------------------------------- PersonId | Name | Surname | ------------------------------------- 1 John Smith 2 Sam Rainbow Address Table ----------------------
Person Table
-------------------------------------
PersonId | Name | Surname |
-------------------------------------
1 John Smith
2 Sam Rainbow
Address Table
------------------------------------------
AddressId | PersonId | Address |
------------------------------------------
1 1 AAA
2 1 BBB
SQL不允许我从Person表中删除,因为地址表中有与此人相关的行
如何创建此关系?您需要定义外键:
DELETE Person WHERE PersonId = 1
您需要定义外键:
DELETE Person WHERE PersonId = 1
您可以尝试以下方法:
ALTER TABLE Address
ADD FOREIGN KEY (PersonId)
REFERENCES Person (PersonId)
之后
DELETE Address WHERE PersonId = 1
也可以在地址表中引用
DELETE Person WHERE PersonId = 1
您可以尝试以下方法:
ALTER TABLE Address
ADD FOREIGN KEY (PersonId)
REFERENCES Person (PersonId)
之后
DELETE Address WHERE PersonId = 1
也可以在地址表中引用
DELETE Person WHERE PersonId = 1
Person
的PersonId
应该是主键
,Address
表的PersonId
应该是外键
,应该引用PersonId
。如果这两个表之间存在这种关系,那么如果地址表中存在ID,DBMS将在从Person表中删除记录时自动返回错误
下面的SQL将更改您的表
ALTER TABLE Address
ADD FOREIGN KEY (PersonId)
REFERENCES Person (PersonId)
Person
的PersonId
应该是主键
,Address
表的PersonId
应该是外键
,应该引用PersonId
。如果这两个表之间存在这种关系,那么如果地址表中存在ID,DBMS将在从Person表中删除记录时自动返回错误
下面的SQL将更改您的表
ALTER TABLE Address
ADD FOREIGN KEY (PersonId)
REFERENCES Person (PersonId)
试试这个,这会解决你的问题 SQL不允许我从Person表中删除,因为存在 地址表中与此人相关的行
DELETE Person WHERE PersonId = 1
试试这个,这会解决你的问题 SQL不允许我从Person表中删除,因为存在 地址表中与此人相关的行
DELETE Person WHERE PersonId = 1
您可以在这些表中创建主键和外键关系,若地址表中有相应的条目,这将防止删除来自Person的记录
DECLARE @CNT AS BIGINT
SELECT @CNT=ISNULL(COUNT(PersonId),0) FROM Address where PersonId=1
IF @CNT=0
BEGIN
DELETE Person WHERE PersonId = 1
END
您可以在这些表中创建主键和外键关系,如果地址表中有相应的条目,这将防止从Person删除记录
DECLARE @CNT AS BIGINT
SELECT @CNT=ISNULL(COUNT(PersonId),0) FROM Address where PersonId=1
IF @CNT=0
BEGIN
DELETE Person WHERE PersonId = 1
END
添加外键约束并限制删除:
CREATE TABLE Person
(
PersonId INT CONSTRAINT pk_person_pid PRIMARY KEY,
Name VARCHAR(25),
Surname VARCHAR(25)
);
CREATE TABLE Address
(
AddressId INT CONSTRAINT pk_address_aid PRIMARY KEY,
PersonId INT CONSTRAINT fk_personAddress_pid FOREIGN KEY REFERENCES Person(PersonId),
AddressVARCHAR(25)
);
添加外键约束并限制删除:
CREATE TABLE Person
(
PersonId INT CONSTRAINT pk_person_pid PRIMARY KEY,
Name VARCHAR(25),
Surname VARCHAR(25)
);
CREATE TABLE Address
(
AddressId INT CONSTRAINT pk_address_aid PRIMARY KEY,
PersonId INT CONSTRAINT fk_personAddress_pid FOREIGN KEY REFERENCES Person(PersonId),
AddressVARCHAR(25)
);
您希望DBMS(SQL Server、MYSQL等)返回错误,还是不希望您的查询删除任何内容(DBMS没有错误),您认为哪一项更有益?@BonusKun:试试我的答案。。!!它解决了你的问题。。!!我总是希望DBMS返回错误。它始终防止由于软件中可能存在的错误而执行任何操作。在这种情况下,我建议您使用带有引用的伪造密钥。下面有许多这样的例子。@BonusKun如果您添加Foreignkey,它不会阻止删除其他表数据,而是删除您希望DBMS(SQL Server,MYSQL,…)返回错误的数据,或者您只是不希望您的查询删除任何内容(DBMS没有错误)你认为哪一个更有益?@BonusKun:试试我的答案。。!!它解决了你的问题。。!!我总是希望DBMS返回错误。它始终防止由于软件中可能存在的错误而执行任何操作。在这种情况下,我建议您使用带有引用的伪造密钥。下面可以找到许多这样的示例。@BonusKun如果您添加Foreignkey,它不会阻止删除其他表数据,但删除bothIt将是命名外键约束的最佳做法。这不会阻止删除其他表数据,但会同时删除这两个数据@SajadLfc只有在启用级联删除(如果可以避免的话,我不会这样做)的情况下,最好将外键约束命名。这不会阻止删除其他表数据,但会同时删除这两个数据@SajadLfc只有在启用级联删除的情况下才可用(如果可以避免的话,我不会这么做)