小编A-K*_*A-K的帖子

跨两列的 MySQL 唯一约束

我有一个定义关系的表

Src smallint(5) unsigned NOT NULL,
Dst smallint(5) unsigned NOT NULL,
other fields
Run Code Online (Sandbox Code Playgroud)

我需要添加一个约束,说明其中一列中是否存在给定值。
1) 不能在同一列中重复。
2) 也不能在其他列中重复。

这是无效的

src    dst
1      354
666    1
Run Code Online (Sandbox Code Playgroud)

由于值 1 出现在第一行中,因此它不能出现在第二行中。

如何定义这种类型的约束?

我正在对应用程序杠杆进行轻量级检查。但我希望数据库确保它。

更新:目前我有 7 种不同类型的关系,每种关系类型一张表。

更新 2:原来这只是一张包含所有关系的表,现在我要爆炸了

# variante
Create TABLE `productsRelationships3` (
  `relSrc` smallint(5) unsigned NOT NULL,
  `relDst` smallint(5) unsigned NOT NULL,
  PRIMARY KEY `src-dst-3` (relSrc, relDst),
  UNIQUE  `src-3` (relSrc)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# this is the import
INSERT INTO productsRelationships3 SELECT relSrc, relDst FROM  productsRelationships WHERE relType=3;
DELETE FROM …
Run Code Online (Sandbox Code Playgroud)

mysql database-design constraint

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

可选择更具体的关系

原谅我的标题,我想不出任何能准确描述我在说什么的东西。

我目前有以下关系。

CREATE TABLE Events 
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name NVARCHAR(64) NOT NULL,
    PRIMARY KEY(ID)
)

CREATE TABLE Locations
(
    ID INT IDENTITY(1,1) NOT NULL,
    EventID INT NOT NULL,
    Name NVARCHAR(64) NOT NULL,
    PRIMARY KEY(ID)
)

ALTER TABLE Locations ADD FOREIGN KEY(EventID) REFERENCES Events(ID)
Run Code Online (Sandbox Code Playgroud)

基本上,一个事件可以有零个或多个位置。我现在想要的是将捐赠与事件相关联,或者更具体地将其与位置相关联。

CREATE TABLE Donations
(
    ID INT IDENTITY(1,1) NOT NULL,
    EventID INT NOT NULL,
    LocationID INT NULL, -- this is optional
    PRIMARY KEY(ID)
)

ALTER TABLE Donations ADD FOREIGN KEY(EventID) REFERENCES Events(ID)
ALTER TABLE …
Run Code Online (Sandbox Code Playgroud)

schema database-design sql-server referential-integrity

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

如何在不保持事务打开的情况下保持结果集?

以下文档描述了如何查看从函数返回的 refcursor,这里,如下所示:

    CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
    OPEN $1 FOR SELECT col FROM test;
    RETURN $1;
END;
' LANGUAGE plpgsql;

BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

这对我有用。但是,如果我想将结果保留在我的屏幕上,我必须保持事务处于打开状态。当我执行 COMMIT 时,我的结果集被丢弃。当我同时执行 FETCH 和 COMMIT 时,第一个结果集被丢弃。

有没有办法提交事务但保留结果集?PgAdmin 的版本是 1.18.1。

postgresql pgadmin cursors postgresql-9.3

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

更新聚集索引记录不是需要两次写入吗

我正在simple-talk上阅读有关索引的文章,其中写道

如果堆上有一个非聚集索引(作为主键),并且数据被插入到表中,则必须发生两次写入。一次写入用于插入行,一次写入用于更新非聚集索引。另一方面,如果一个表有一个聚集索引作为主键,插入只需要一次写入,而不是两次写入。这是因为聚集索引及其数据是一体的。因此,将行插入到以聚集索引为主键的表中比将相同的数据插入到以非聚集索引为主键的堆中要快。无论主键是否单调递增,都是如此。

是不是错了?聚集索引自然求助于 B+ 树,其中只有键存储在中间节点中(与 B 树不同,B 树存储整个记录。这就是为什么 B+ 树可以在单个页面中容纳更多键,导致其宽度庞大但高度较短),因此所有记录都存储在叶子页面中(页面本身通过链表进行逻辑排序,而每个页面中的数据进行物理排序)。因此,如果必须更新记录,例如必须将值 1 更新为 7,则更新是否需要同时应用于聚集索引顶部节点中的两个键(在某些情况下,这可能会导致重新整个结构的结构)和叶页中记录中的相应值?

在此处输入图片说明 更新:好的,我做了一些研究,发现除了初始树结构(其中一些值必须出现两次,例如节点中的键值),当插入新值时,它们正好适合叶页,而树被重组以适应这一点。但是,当插入 5 个值时,第 3 个值可能会导致第一个插入的值(当前仅占用叶级空间)级联,从而导致它被写入两次(一次在叶级,其他在叶级)指数水平)。当然,这种重写(虽然它们不会在插入时发生,但它们可以稍后发生)与每次插入到带有 NCI 的堆中时发生的两次写入相比要少得多,但是说没有重写也不是错吗?

index sql-server clustered-index nonclustered-index

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

三个表之间的唯一外键约束

我想跟踪约会出席情况。访客可以预约,也可以直接出现。如果他们有约会,但错过了,在这种情况下,我想记录下错过约会的原因(如果知道)。

这些表格似乎涵盖了它:

appointments: id, visitor_id, scheduled_time
attendances: id, appointment_id, arrival_time
missed_appointments: id, appointment_id, reason
Run Code Online (Sandbox Code Playgroud)

我将如何添加约束,以便不能错过和参加约会?这个模式只是让它过于复杂吗?

postgresql foreign-key database-design

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

SQL Server 2005,针对表的一部分进行外键检查

我有一个articles引用categories表的表。我像这样定义外键:

constraint fk_categoryid foreign key (categoryid) references categories (categoryid)
on update no action
on delete no action
Run Code Online (Sandbox Code Playgroud)

是否可以在外键定义中限制可以基于categories表中另一列引用的类别?例如,假设表中有一个hasarticlescategories。我希望将外键约束限制在hasarticles = true.

sql-server-2005 foreign-key database-design

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

发现违反对称约束

假设我有一个Friends包含列的表Friend1ID, Friend2ID。我选择用两条记录来代表每段友谊,比如 (John, Jeff) 和 (Jeff, John)。因此,每对朋友应该恰好出现在表中两次。

有时,这个约束被违反,即一对朋友在表中只出现一次。我如何编写一个查询来识别所有这些情况(理想情况下,使用合理的标准 SQL)?换句话说,我希望查询返回此表中的行列表,其中没有对应的行与交换字段。

另一个问题:有没有办法在 MySQL 中强制执行这种参照完整性?

mysql database-design constraint referential-integrity

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

PosgtreSQL - 在一个查询中更改多个字段排序规则

我有一个小型数据库,其中很少有带有"default"排序规则的文本字段。我不想重新创建数据库。一次更改所有有问题的字段的查询是什么?

要更改我可以使用的单个

ALTER TABLE a_table_name ALTER a_column_name TYPE text COLLATE a_collate;
Run Code Online (Sandbox Code Playgroud)

postgresql collation

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

什么时候创建索引?

我有一个大约需要 2 分钟才能执行的存储过程。执行计划建议我在一个表上创建一个非聚集索引(这是一个包含数百万条记录的高流量表,而且每秒钟都有一个恒定的数据流)。

请帮助我决定是否应该在该表上创建索引。

注意:我尝试在该表上(在开发服务器上)创建一个非聚集索引,时间从 2 分钟减少到 40 秒。

index sql-server-2008 nonclustered-index

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