我正在尝试为两列(id_1 和 id_2)创建唯一索引约束,条件如下:如果两个不同的行在 id_2 列中具有相同的值,则它们在 id_1 列中的值也必须相同。
是否可以?
谢谢。
假设我有一个集合,我在字段上创建一个唯一索引:
db.users.createIndex({username: 1}, {unique:true})
Run Code Online (Sandbox Code Playgroud)
如果具有相同用户名的两个文档同时插入集合中会发生什么?
数据库如何防止冲突?我的意思是哪一个插入,哪个导致错误?
假设插入实际上是SIMULTANEOUS,数据库无法知道正在插入两个重复项,对吧?
那么,究竟发生了什么?
我在 Postgres 数据库中有两个名为players& 的表matches,如下所示:
CREATE TABLE players (
name text NOT NULL,
id serial PRIMARY KEY
);
CREATE TABLE matches (
winner int REFERENCES players (id),
loser int REFERENCES players (id),
-- to prevent rematch btw players
CONSTRAINT unique_matches
PRIMARY KEY (winner, loser)
);
Run Code Online (Sandbox Code Playgroud)
如何确保仅将(winner, loser)或的唯一组合(loser, winner)用于matches主键,以便matches表不允许插入:
INSERT INTO matches VALUES (2, 1);
Run Code Online (Sandbox Code Playgroud)
如果它已经有一行包含VALUES (1, 2)像:
winner | loser
--------+-------
1 | 2
Run Code Online (Sandbox Code Playgroud)
目标是避免相同玩家之间的比赛进入。
假设我有一个表,我不想在其中包含重复的行。
为了避免相等检查,我计划在MOST(如果不是全部)列上创建一个唯一索引。在我的应用程序中,无论是否相等,我都可以疯狂地插入记录。除了一些基本的查询,我对这个表没有任何特殊的性能要求。
我的问题是:
顺便说一句,如果是与数据库引擎相关的问题,我正在使用 MySQL,尽管我对一般解释感兴趣。
谢谢!
假设我有一张表:雇主和:雇员。我想添加以下内容:
ALTER TABLE employers ADD UNIQUE (employee_id);
Run Code Online (Sandbox Code Playgroud)
这在开发中运行良好,但由于生产中已经存在重复记录,因此它在生产中不起作用。
有没有办法添加唯一性约束的序列号,即仅对新记录施加唯一性约束?
我正在使用 Postgres 9.6.2 创建电影和电视节目流媒体服务数据库(用于学校项目)。我遇到以下错误:
没有与引用表“watchedepisodes”的给定键匹配的唯一约束
只要用户观看了至少一集(显示在 WatchedEpisodes 表中),下面的电视收视率表就会接受电视节目并允许用户对其进行评分。由于 WatchedEpisodes 具有用户 id、电视节目 id、季节和剧集的复合主键,因此它不允许我仅从该表中引用仅包含 uid 和 tid 的复合键。
CREATE TABLE WatchedEpisodes (
uid int unique references Users(uid),
tid int,
season int,
episode int,
FOREIGN KEY(tid, season, episode) REFERENCES Episodes(tid, season, episode),
PRIMARY KEY (uid, tid, season, episode)
);
CREATE TABLE TVRatings (
uid int,
tid int,
rating int check (rating > 0 and rating < 6),
FOREIGN KEY(uid, tid) REFERENCES WatchedEpisodes(uid,tid),
PRIMARY KEY(uid, tid)
);
Run Code Online (Sandbox Code Playgroud)
想知道是否有办法只引用该组合键的一部分。这些只是我的两个表格,因此如果需要更多信息,我可以添加更多信息。
sql database postgresql unique-constraint composite-primary-key
对于以下 API 端点,
import json
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse, HttpResponseBadRequest
from django.views.decorators.http import require_POST
from lucy_web.models import UserApn
@login_required
@require_POST
def save_apn(request, version):
player_id = json.loads(request.body).get('player_id')
if player_id:
UserApn.objects.get_or_create(user=request.user, player_id=player_id)
return JsonResponse({'status': 'success'})
else:
return HttpResponseBadRequest()
Run Code Online (Sandbox Code Playgroud)
这是底层模型:
from django.contrib.auth.models import User
from django.db import models
from .timestamped_model import TimeStampedModel
class UserApn(TimeStampedModel):
user = models.ForeignKey(User)
player_id = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
对 的调用get_or_create()引发了一些MultipleObjectsReturned错误。为了解决这个问题,我想对和施加unique_together约束。然而,首先,我必须编写一个数据迁移,以消除违反此唯一共同约束的行。userplayer_id
我如何编写一个选择这些的查询?目前已提出以下建议:
def remove_duplicate_apns(apps, schema_editor):
UserApn = apps.get_model('lucy_web', 'UserApn')
previous_user_id …Run Code Online (Sandbox Code Playgroud) 我有一个 java 应用程序,它使用 Liquibase 进行迁移,到目前为止一直使用 MySQL 来运行测试用例。
我想使用 h2 数据库运行测试用例。为此,我对 JDBC 配置进行了必要的更改。但是当我运行时mvn test,出现以下错误:
索引“idx_workflow_id”已存在;SQL语句:
在调试时,我发现两个表具有相同名称的索引:idx_workflow_id,并且 h2 数据库具有数据库中具有唯一索引名称的一些限制。
现在的问题是数据库结构已经存在于 staging 和 prod 中,并且无法更改索引名称。
有什么方法可以运行 h2 数据库的迁移,而不创建索引或忽略它们。或者进行一些配置更改,这将允许数据库中具有相同名称的索引。
配置:
database:
driverClass: org.h2.Driver
url: "jdbc:h2:mem:my_db;MODE=MySQL;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;DB_CLOSE_DELAY=-1"
maxWaitForConnection: 1s
minSize: ${MIN_DB_CONNECTIONS:-10}
maxSize: ${MAX_DB_CONNECTIONS:-100}
defaultTransactionIsolation: READ_COMMITTED
checkConnectionWhileIdle: false
checkConnectionOnBorrow: true
checkConnectionOnConnect: true
validationQuery: "SELECT 1"
properties:
hibernate.dialect: org.hibernate.dialect.H2Dialect
hibernate.show_sql: false
hibernate.hbm2ddl.auto: none
hibernate.session.events.log: false
hibernate.generate_statistics: true
org.hibernate.stat: INFO
charSet: UTF-8
Run Code Online (Sandbox Code Playgroud) 我正在构建一个包含系统条形码以及自定义条形码选项的数据库。我对custom_barcode和有一个独特的约束system_barcode。
我想做的是拥有它,因此如果custom_barcode值为 \xe2\x80\x9c123\xe2\x80\x9d,则其他行都不能具有值为 \xe2\x80\x9c123" 的custom_barcodeOR 。我没有尝试制作一个 2 列唯一约束,其中如果是“123”并且是“456”,则该组合不能再次存在。是否可以实现此目的?我想知道这是否需要通过触发器来实现。system_barcodecustom_barcodesystem_barcode
我有一个带有ExternalSystemName 值对象和另一个实体的部署父类型的实体。该模型的重要部分如下所示:
public sealed class ExternalSystem : Entity
{
public ExternalSystemName Name { get; private set; }
public Deployment Deployment { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
该实体的唯一性由部署 ID(存储在部署实体类中)和名称(ExternalSystemName 值对象的值)的组合确定。换句话说,一个部署不能有 2 个同名的外部系统。
我在尝试使用 IEntityTypeConfiguration 实现设置此组合唯一索引时遇到问题:
internal sealed class ExternalSystemsConfiguration :
IEntityTypeConfiguration<ExternalSystem>
{
public void Configure(EntityTypeBuilder<ExternalSystem> builder)
{
builder.ToTable("TblExternalSystems");
builder.OwnsOne(e => e.Name, navigationBuilder =>
{
navigationBuilder.Property(e => e.Value)
.HasColumnName("Name");
});
builder.HasIndex(e => new { e.Name, e.Deployment }).IsUnique();
}
}
Run Code Online (Sandbox Code Playgroud)
我在运行 API 时遇到此异常:
System.InvalidOperationException: ''Name' cannot be used as a property on entity …Run Code Online (Sandbox Code Playgroud)