gpt4 book ai didi

sql - 如何在启用 softDeletes 时定义唯一索引

转载 作者:行者123 更新时间:2023-12-05 02:23:18 25 4
gpt4 key购买 nike

Laravel 4.1 会在 softDeletes 时自行管理唯一索引的创建(其中 deleted_at = null)吗?

下面的方法是否正确?还是会混入已删除的记录?

Schema::create('example', function(Blueprint $table) {
$table->increments('id');
$table->integer('example')->unsigned()->unique(); //?????
$table->softDeletes();
});

数据库是mysql,如果其他数据库有一定的解决方案,也可以提供。但是,它应该在 laravel 框架内完成!一个统一的解决方案,适用于 laravel 官方支持的所有数据库。

更新似乎这种方法不起作用,因为它只是忽略了 softDeletes() 选项。

所以提出的解决方案

Schema::create('exampe', function(Blueprint $table) {
$table->increments('id');
$table->integer('example')->unsigned();
$table->softDeletes();
$table->unique('example', 'deleted_at');
});

问题是 deleted_at 列中可能存在两个完全相似的时间戳。

我真正需要的是一个 where 条件。

$table->unique('example', array('where', 'deleted_at', '=', null));

$table->integer('example')->unsigned()->unique()->where('deleted_at', '=', null)

最佳答案

我建议对您希望唯一的列(example)和一个虚拟列(例如名为 is_live)设置一个两列 UNIQUE 约束。当该行被软删除时,此列始终为“1”。当您软删除一行时,设置 is_live=NULL

原因与“唯一性”的定义方式有关。 唯一约束允许任意数量的行具有 NULL 值。这是因为 NULL 不等于 SQL 中的 NULL,因此两个 NULL 算作“不相同”。

对于多列唯一键,如果任何列为 NULL,则唯一键中的整组列的行为就好像它与任何其他行不同。因此,只要唯一键中的另一列为 NULL,您可以让任意数量的行具有相同的唯一键。

create table example (
id serial primary key,
example int unsigned not null,
is_live tinyint default 1,
unique key (example, is_live)
);

演示:http://sqlfiddle.com/#!9/8d1e4d/1

PS:关于在 MySQL 中实现索引条件的问题的直接答案是 MySQL 不支持这个。支持部分索引的数据库包括:

关于sql - 如何在启用 softDeletes 时定义唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23323217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com