相关疑难解决方法(0)

如何在SQL Server中使用INNER JOIN从多个表中删除

在MySQL中,您可以使用语法

DELETE t1,t2 
FROM table1 AS t1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Run Code Online (Sandbox Code Playgroud)

我如何在SQL Server中执行相同的操作?

sql t-sql sql-server

107
推荐指数
6
解决办法
21万
查看次数

SQL Server更新主键,它也是两个表中的外键

我需要更新记录的主键,但它也是另外两个表中的外键.我还需要更新的主键也反映在子表中.

这是我的查询和错误:

begin tran
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Run Code Online (Sandbox Code Playgroud)
Error  9/4/2009 10:04:49 AM    0:00:00.000 SQL Server Database Error: The UPDATE statement conflicted with the REFERENCE constraint "FK_GoalRequirement_Question". The conflict occurred in database "numgmttest", table "dbo.GoalRequirement", column 'QuestionID'.   14  0

我不记得该怎么做这就是为什么我在这里.有帮助吗?

sql-server

32
推荐指数
4
解决办法
7万
查看次数

实体框架4.1 InverseProperty属性和ForeignKey

我将使用外键在Employee和Team实体之间创建两个引用.所以我定义了两个实体如下

public class Employee
{
    public int EmployeeId { get; set; }
    public string Name { get; set; }

    [ForeignKey("FirstTeam")]
    public int FirstTeamId { get; set; }

    [InverseProperty("FirstEmployees")]
    public virtual Team FirstTeam { get; set; }

    [ForeignKey("SecondTeam")]
    public int SecondTeamId { get; set; }

    [InverseProperty("SecondEmployees")]
    public virtual Team SecondTeam { get; set; }
}

public class Team
{
    public int Id { get; set; }
    public string TeamName { get; set; }

    [InverseProperty("FirstTeam")]
    public virtual ICollection<Employee> FirstEmployees { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# mapping entity cascading-deletes entity-framework-4.1

31
推荐指数
1
解决办法
2万
查看次数

外键级联多路径和周期有什么问题?

在MSSQL 2005中,我刚刚发现臭名昭着的错误消息:

在表YYY上引入FOREIGN KEY约束XXX可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.

现在,StackOverflow有关于此错误消息的几个主题,所以我已经得到了解决方案(在我的情况下我将不得不使用触发器),但我很好奇为什么会出现这样的问题.

据我了解,他们基本上有两种情况需要避免 - 一个循环和多个路径.一个循环是两个表彼此级联外键的地方.好的,一个循环也可以跨越几个表,但这是基本情况,并且更容易分析.

当TableA具有TableB和TableC的外键时,将有多个路径,TableB也具有TableC的外键.再次 - 这是最基本的案例.

当在任何这些表中删除或更新记录时,我看不到任何问题.当然,您可能需要多次查询同一个表以查看哪些记录需要更新/删除,但这真的是一个问题吗?这是性能问题吗?

在其他SO主题中,人们甚至将使用级联标记为" 有风险 ",并声明" 解决级联路径是一个复杂的问题 ".为什么?风险在哪里?问题出在哪儿?

sql cascade foreign-keys rdbms-agnostic

18
推荐指数
1
解决办法
9255
查看次数

两个外键引用一个表 - ON UPDATE SET NULL不起作用

我在表中有两个外键.我们假设该表被调用News并具有外键,updatedById并且createdById两者都指向userId表中Users.

现在我想在NULL删除用户时设置外键,但是当我尝试设置ON DELETE SET NULL该关系时,我得到:

在表'新闻'上引入FOREIGN KEY约束'FK_News_Users'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.

我不明白为什么两个外键都不能设置为null?

t-sql sql-server cascade constraints foreign-keys

7
推荐指数
1
解决办法
1万
查看次数

为什么这是一个周期性的外键约束?

我在我要更新的应用程序中遇到了这个标记为"错误"的代码.在测试数据库上运行它会产生循环引用错误:

引用关系将导致不允许循环引用(Constraint name = descriptions_fk_2)

我命名约束以查看哪个引起了问题.

CREATE TABLE items (
id INT NOT NULL UNIQUE IDENTITY,
name NCHAR(100) NOT NULL UNIQUE,
PRIMARY KEY (id)
);

CREATE TABLE sources (
id INT NOT NULL UNIQUE IDENTITY,
item_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (item_id)
REFERENCES items(id) ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE descriptions (
id INT NOT NULL UNIQUE IDENTITY,
item_id INT NOT NULL, 
source_id INT NOT NULL,
PRIMARY KEY (id),
CONSTRAINT descriptions_fk_1 FOREIGN KEY …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

6
推荐指数
1
解决办法
1317
查看次数

替代FK SET NULL设计导致循环

可能重复:
外键约束可能导致循环或多个级联路径?

我有一个联系人详细信息数据库,其中包含四个主要表:

  • 组织
    • 部门

这是一个图表(箭头表示外键约束):

重要提示:我不小心将绿色箭头标记为指向per_PerID.它应该指向per_SecID

在此输入图像描述

我创建了约束,确保每个部门记录属于一个组织,每个部分属于一个部门,等等.这些外键约束的操作设置为CASCADE,因此删除组织将删除所有相应的部门等.

问题是每个组织都需要有一个负责人.这将转换为字段上的外键约束,该约束将包含负责人的ID.创建约束很简单,但是当我尝试将操作设置ON DELETE为时SET NULL,我收到以下错误:

在表格上引入FOREIGN KEY约束...可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.

我的理由是,只有当我设置动作时才会发生循环,但CASCADE不是SET NULL,但显然这是不正确的.

  1. 人员记录已删除
  2. org_incharge_PerID 在相应的组织记录中设置为null
  3. 没有进一步的传播.如果组织已被删除,则会出现问题,因为部门也会引用组织.事实上,不应该有问题.

是否有另一种方法可以确保引用完整性,还是应该重新考虑我的表结构,以一种可以完全避免周期问题的方式?

我想要的是org_incharge_PerID被限制per_PerID在人员表中的s 集合.此外,NULL如果删除该人,我希望将值设置为.

sql-server database-design referential-integrity foreign-key-relationship sql-server-2008

5
推荐指数
1
解决办法
1466
查看次数

如何在没有 ON DELETE CASCADE 的情况下进行 DELETE(冲突 REFERENCE 约束)

我有一个巨大的遗留数据库,其中一个表有多个外键指向另一个表,并且看不到一个级联,类似于下面的示例表:

create table Users (
    Id int primary key identity,
    Name varchar(max)
)

create table Products (
    Id int primary key identity,
    Name varchar(max),
    CreatedBy int foreign key references Users(Id),
    UpdatedBy int foreign key references Users(Id)
)

insert into Users values('Bar')
insert into Users values('Baz')
insert into Products values('Foo', 1, 2)
Run Code Online (Sandbox Code Playgroud)

我需要能够删除一些旧数据,但它当然会引发引用异常:

delete from Users where Name='Bar'
Run Code Online (Sandbox Code Playgroud)

DELETE 语句与 REFERENCE 约束“FK__Products__Create__1AD3FDA4”冲突。冲突发生在数据库“Foo”、表“dbo.Products”、“CreatedBy”列中。


由于数据库的绝对复杂性,我无法预先删除所有引用,因此我尝试通过级联设置以编程方式添加临时外键以解决它们。但是,对于这个具有多个指向另一个表的外键的特定表,这会导致cycles or multiple cascade paths第二个UpdatedBy更改:

alter table Products add foreign key (CreatedBy) references Users(Id) on …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server cascading-deletes

4
推荐指数
1
解决办法
2万
查看次数

实体框架外键约束

我仍然在使用EF.我在我的项目中使用代码优先方法并偶然发现了以下问题.

我有以下对象:

public class Employee
{
    public int EmployeeId { get; set; }
    public int BusinessUnitId { get; set; }

    public virtual BusinessUnit BusinessUnit { get; set; }
}

public class Quote
{
    public int QuoteId { get; set; }

    [DisplayName("Business Unit")]
    public int BusinessUnitId { get; set; }

    [DisplayName("Responsible Employee")]
    public int EmployeeId { get; set; }

    [DisplayName("Date Issued")]
    [DataType(DataType.Date)]
    public DateTime DateIssued { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    public virtual Employee Employee …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework

4
推荐指数
1
解决办法
6978
查看次数

MSSQL 约束可能会导致循环或多级联路径

我有一个这样的场景:

User可以拥有多个AccountsUser还有比特币地址(他自己输入的),它们是“提现地址”。每个Account也可能有多个比特币地址(即“存款地址”)。

所有地址都在一张表中,唯一的区别是充值/提现仅由Type表中的一列指定BitcoinAddresses

我想创建一个场景,删除User将导致他拥有的所有提款都BitcoinAddresses被删除,并且Accounts他拥有的所有提款也被删除。但是删除 anAccount应该会导致BitcoinAddresses引用被设置为NULL

我尝试过类似的事情:

CREATE TABLE [dbo].[Users] (
    [Id]                 NVARCHAR (128) NOT NULL,
    [UserName]           NVARCHAR (64)  NULL,
    CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ([Id] ASC),
);

CREATE TABLE [dbo].[Accounts] (
    [Id]       BIGINT         IDENTITY (1, 1) NOT NULL,
    [UserId]   NVARCHAR (128) NOT NULL,
    [Number] BIGINT         NOT NULL,
    CONSTRAINT [PK_dbo.Accounts] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.Accounts.Users_UserId] FOREIGN …
Run Code Online (Sandbox Code Playgroud)

sql-server

3
推荐指数
1
解决办法
1979
查看次数

实体框架核心,DELETE CASCADE和[Required]

我在Entity Framework Core中遇到了一个DELETE CASCADE问题,我似乎找不到很好的解决方案。

这是我的模型的超级简化版:

User {UserID, Name}
Recipe {RecipeID, UserID}
Ingredient {IngredientID, UserID}
RecipeIngredient {RecipeID, IngredientID} *RecipeIngredient is the many-to-many table.
Run Code Online (Sandbox Code Playgroud)

Recipe和Ingredient都将UserID标记为[Required],并且RecipeIngredient将RecipeID和IngredientID标记为[Required]。

问题是SQL将不会创建数据库,因为存在多个到RecipeIngredient的级联删除路径(“引入FOREIGN KEY约束...可能会导致循环或多个级联路径”)。

所以我被困住了……我已经解决了一些想法,但是没有任何事情奏效。

  1. 这里有设计解决方案吗?我想保留我的外键,因为强制执行它是有意义的,但是如果有设计解决方案,我会接受的。

  2. 我的下一个想法是删除所有指向用户的FK-我必须在DELETE期间通过C#代码强制执行参照完整性,并且可以在CREATE期间使用[Required]强制输入数据。出现的问题-[必需]创建一个FK,并添加“ ON DELETE CASCADE”,这使我们重新回到多级联删除路径问题中。我真的很想保留[Required],因为它与Razor页面的集成巧妙,客户端验证和错误等。

  3. 下一个想法,在OnModelCreating(...)中将级联行为设置为SetNull:

    modelBuilder.Entity()。HasOne(i => i.User).WithMany(u => u.Ingredients).OnDelete(DeleteBehavior.SetNull);

    modelBuilder.Entity().HasOne(r => r.Source).WithMany(s => s.Recipes).OnDelete(DeleteBehavior.SetNull);

但这引发了一个异常,因为即使我在“成分和配方”中的属性设置为Nullable:

[Required(ErrorMessage = "User ID is required.")] 
public Nullable<int> UserID { get; set; }
Run Code Online (Sandbox Code Playgroud)

...由于[Required]属性,EF仍将其创建为NOT NULL数据库列。

有什么解决方案?据我所知,我应该将所有FK删除给User,然后尝试将其强制作为CREATE上的必填字段,但是我看不到要使用数据注释来做到这一点的方法。将此逻辑保留在我的代码优先模型中。

c# asp.net-mvc data-annotations entity-framework-core

3
推荐指数
1
解决办法
2632
查看次数

SQL Server中的表之间的约束,删除一个应该删除另一个

我正在创建两个表RegistrationHeader和RegistrationDetail.我如何添加一个约束,当我删除RegistrationHeader表以自动删除RegistrationDetail表.

create table RegistrationHeader(
    RegistrationNo numeric
    ,BillingID varchar(30) not null
    ,RegistrationDate date not null
    ,PaymentType varchar check (PaymentType = 'CC' or PaymentType = 'PO' or PaymentType = 'Check') not null
    ,CCNumber numeric check(CCNumber >= 15 and CCNumber <=16)
    ,PONumber varchar(30)
    ,CheckNumber varchar(10)
    ,primary key(RegistrationNo)
    ,foreign key(BillingId) references Person(UserID) 
    ,constraint CC_CCNumber_constr check(
        (PaymentType = 'CC' and CCNumber is not null)
        or
        (PaymentType != 'CC' and CCNumber is null)
    )
    ,constraint PO_PONumber_constr check(
        (PaymentType = 'PO' and (PONumber is not null or …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

2
推荐指数
1
解决办法
89
查看次数