Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表之间的关系_Sql - Fatal编程技术网

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只有在启用级联删除的情况下才可用(如果可以避免的话,我不会这么做)