我正在开发一个 ASP.NET MVC 项目。我正在使用实体框架代码优先方法与数据库交互。但我在为实体的自引用外键设置级联删除时遇到问题。
这是我的带有自引用外键的实体类
public class Category
{
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
[MaxLength(55)]
public string MmName { get; set; }
public int? ParentId { get; set; }
[ForeignKey("ParentId")]
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的背景
public class StoreContext : DbContext
{
public StoreContext():base("DefaultConnection")
{
}
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder …Run Code Online (Sandbox Code Playgroud) asp.net entity-framework foreign-keys ef-code-first entity-framework-migrations
谁能向我解释一下图中所示的 mysql 中的内部关系和外键约束之间的区别?当我学习 Microsoft SQL Server 管理工具中的基本数据库设计时,这种内部关系概念对我来说是新的,并且在我的 Web 应用程序中出现外键错误。此外,如果我对数据库进行逆向工程以获得可视模式,则如果我仅使用内部关系,则表之间的连接不可见。需要外键来生成这些连接。
mysql database-design foreign-keys relational-database sql-server-2008
我遇到了一个决定性的情况。它与 RDBMS 尤其是 SQL Server 有关。
根据我的想法,任何数据库都有多个表,并且这些表直接通过键或在查询时通过联接互连。现在,根据我的理解,我想到了以下两种数据库设计选项。
1 - 没有关系(没有外键)
如果我不提供表之间的任何外键关系,我可能没有参照完整性,但我可以使用 PK 删除父记录,而子记录仍然完好无损。如果我在父级中重新创建 PK 记录,它会在加入时再次开始引用其子级。这是好处之一。但是如果我更新父PK记录,我必须更新所有表记录。这就是缺点。
2 - 与关系(与外键)
如果我在表之间建立了外键,我不需要为这些记录的更新和删除进行额外的编码。但当我只想删除 PK 或父记录时,问题就来了。因此,我需要在每个表中提供一些列,然后我必须在我使用的每个查询中IsActive查找列。IsActive这是非常令人讨厌和冗长的。所以它也并不完全完美。
现在你能建议我应该采用什么数据库设计模式来摆脱这个困境吗?
我正在尝试将外键添加到表中,但我不能,因为我收到此错误:
消息 547,级别 16,状态 0,第 1 行 ALTER TABLE 语句与 FOREIGN KEY 约束“FK_RDATA_COMBO_VALUES_ID_REFERENCES”冲突。冲突发生在数据库“MyDatabase”、表“dbo.EVA_REFERENCES”、列“ID_REFERENCES”中。
错误消息表明问题与此冲突,FK_RDATA_COMBO_VALUES_ID_REFERENCES但这是我尝试创建的 FK 的名称,它还不存在。
这是我的桌子:
CREATE TABLE [dbo].[RDATA_COMBO_VALUES](
[ID_RDATA_COMBO] [int] IDENTITY(1,1) NOT NULL,
[ID_REF_CDATA] [int] NOT NULL,
[ID_MODULE_REC_ID] [int] NOT NULL,
[VALUE] [nvarchar](max) NULL,
[ID_REFERENCES] [int] NOT NULL,
CONSTRAINT [PK_RDATA_COMBO_VALUES] PRIMARY KEY CLUSTERED
(
[ID_RDATA_COMBO] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[RDATA_COMBO_VALUES] WITH CHECK ADD …Run Code Online (Sandbox Code Playgroud) 使用具有以下架构的SQLite3 :
CREATE TABLE Customers(ID INTEGER PRIMARY KEY, Company TEXT NOT NULL UNIQUE, Country TEXT NOT NULL, City TEXT NOT NULL);
CREATE TABLE Orders(ID INTEGER PRIMARY KEY, CustomerID INTEGER NOT NULL, FOREIGN KEY(CustomerID) REFERENCES Customers(ID) ON DELETE RESTRICT ON UPDATE RESTRICT);
Run Code Online (Sandbox Code Playgroud)
并发出此命令:
PRAGMA foreign_key_list(Orders);
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
0|0|Customers|CustomerID|ID|RESTRICT|RESTRICT|NONE
Run Code Online (Sandbox Code Playgroud)
由于文档没有说明此编译指示的输出的含义,除了明显的(客户- 父表、客户 ID - 子键、ID - 父键、RESTRICT - ON DELETE 和第二个RESTRICT - ON UPDATE)之外,我认为NONE对应于不支持的 MATCH 子句。
我自己无法弄清楚的是前两个零的含义。有人能告诉我那是什么吗?
当我alter table在 innodb 表上运行分区时,我在 Mysql 5.7 上收到此错误:
Foreign keys are not yet supported in conjunction with partitioning
Run Code Online (Sandbox Code Playgroud)
知道我已经drop foreign key有了这张表,以及drop foreign key这张表的 id 在哪里。
现在这是我的表架构:
| record | CREATE TABLE `record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`altitude` smallint(6) DEFAULT NULL,
`counter` double DEFAULT NULL,
`datetime` datetime NOT NULL,
`details` longtext,
`deviation` smallint(6) DEFAULT NULL,
`engine` tinyint(1) DEFAULT NULL,
`event` smallint(6) DEFAULT NULL,
`fuel_level` double DEFAULT NULL,
`gsm_level` int(11) DEFAULT NULL,
`latitude` double NOT …Run Code Online (Sandbox Code Playgroud) class Notebook(models.Model):
title=models.CharField(max_length=10)
father = models.ForeignKey('self', on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
如何使用它?
n1=Notebook(title='a', father='???')
n2=Notebook(title='b', father=n1)
Run Code Online (Sandbox Code Playgroud)
如何设置n1的父亲属性值?
我正在使用 PostgreSQL。e_id 是主键,我想将数据类型从 char(5) 更改为整数。
Column | Type | Modifiers
-----------+-----------------------+-----------
e_id | character(5) | not null
Column | Type | Modifiers
-----------------+--------------+-----------
employee_e_id | character(5) | not null
product_prod_nr | character(5) | not null
hours | numeric | not null
Indexes:
"works_on_pkey" PRIMARY KEY, btree (employee_e_id, product_prod_nr, hours)
Foreign-key constraints:
"works_on_employee_e_id_fkey" FOREIGN KEY (employee_e_id) REFERENCES employee(e_id)
Run Code Online (Sandbox Code Playgroud)
我的数据库中的一个表已经依赖于该主键。有办法做到这一点吗?
我在 Postgres 中有一个表,其中包含Things。这些事物中的每一个都可以是以下 3 种类型中的一种:
本质上,用对象术语来说,有一个 AbstractThing,由 SuperThingA 或 SuperThingB 以不同方式扩展,并且 Thing 表上的所有记录要么未扩展,要么以两种方式之一扩展。
为了在事物表上表示这一点,我有许多所有类型的事物共有的字段,并且我在 SuperThingA 和 SuperThingB 表中有 2 个可选的 FK 参考列。
理想情况下,我希望两者都具有“FK IF NOT NULL”约束,但这似乎不可能;据我所知,我所能做的就是使这两个字段都可以为空,并依靠使用代码来维护 FK 关系,这非常糟糕。这似乎在其他数据库中是可行的,例如 SQL Server,根据SQL Server 2005: Nullableforeign Key Constraint,但到目前为止我在 PG 中没有找到任何方法
我还能如何处理这个问题 - 当这些字段中的任何一个不为空时检查值并检查哪个父表上存在该值的插入/更新触发器?这在事物表上插入有限的小型父表上也许是可行的(公平地说,这里的情况基本上就是这样——每个父表中不超过几百条记录,并且事物上的插入数量很少)表),但在更一般的情况下,如果一个或两个父表很大,则插入时将成为性能黑洞
目前,对于 FK 关系,这一点并未强制执行。我已经查看了 PG 文档,并且似乎很确定我不能拥有可选的 FK 关系(这是可以理解的)。它给我留下了一个像这样的表定义:
CREATE TABLE IF NOT EXISTS Thing(
Thing_id int4 NOT NULL,
Thing_description varchar(40),
Thing_SuperA_FK int4,
Thing_SuperB_FK char(10),
CONSTRAINT ThingPK PRIMARY KEY (Thing_id)
) …Run Code Online (Sandbox Code Playgroud) 所以我有2张桌子。表 B 与表 A 具有外键关系。
例如。
Table A
id column 1 column 2
1 some thing
2 foo bar
3 hello world
4 this that
5 x y
Table B
id Table A id testcolumn
1 5 blah
2 5 blah
3 2 aggg
4 2 aggg
5 4 a
6 4 b
7 4 c
Run Code Online (Sandbox Code Playgroud)
我想要的是从表 A 中选择所有元素,其中表 B 中没有外键匹配。在示例的情况下,我想从表 A 中选择 id 为 1 和 3 的行。我该怎么做在 MS SQL 数据库中实现这一点?
foreign-keys ×10
sql-server ×3
mysql ×2
postgresql ×2
asp.net ×1
database ×1
ddl ×1
django ×1
entity-framework-migrations ×1
option-type ×1
pragma ×1
primary-key ×1
sql ×1
sqlite ×1