sql - Postgresql 复合唯一键(姓氏、名字、中间名)不起作用?

标签 sql postgresql laravel unique

我在 Laravel (postgresql) 中有以下模式

Schema::create('members', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('lname');
        $table->string('fname');
        $table->string('mname')->nullable();
        $table->string('ename', 10)->nullable();

        $table->unique(array('lname', 'fname', 'mname'));
    });

如您所见,我有一个由 lnamefnamemname 组成的复合唯一键。但是,我已将 mname 设置为 nullable(),因为并非所有人都有中间名。

但是,向数据库(postgresql)添加数据时

DB::table('students')->insert(
    array(
        array(
            'lname' => 'Last 1',
            'fname' => 'First 1'
        ),
        array(
            'lname' => 'Last 1',
            'fname' => 'First 1'
        )
    )
);

保存成功!我做错了吗?解决方法是什么?请帮忙。

最佳答案

记住基本规则:

NULL!= NULL or NULL <> NULL

即使两者都有 NULL value 它们无法比较,因为它们是未定义的。 NULL不等于什么都没有。 NULL等于未定义。像这样想一想 NULL就像 Chuck Norris,因为没有什么可以与 Chuck Norris 相提并论。

因此你的 key :

Last1 NULL First1
Last1 NULL First1 

作为 NULLS 是独一无二的没有可比性。

为了让这个工作默认一个NULL '' 的中间名字符串或零长度字符串。

关于sql - Postgresql 复合唯一键(姓氏、名字、中间名)不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010648/

相关文章:

PostgreSQL COPY FROM STDIN 表达式

laravel - 如何覆盖Session::get?

mysql - 错误 1054 (42S22) : Unknown column '' in 'where clause'

sql - sql中的having子句中的case语句

postgresql - Postgres : How to get aggregates of multiple columns

sql - SELECT ... FOR UPDATE SKIP LOCKED in REPEATABLE READ 事务

拉拉维尔 5.1 : how can i update one row only with where clause?

php - Laravel 社交名媛 : Laravel\Socialite\Two\InvalidStateException

java - 无限循环的线程在捕获一些异常后停止

javascript - 节点 + MySQL [ECONNREFUSED 127.0.0.1 :3306]