Postgresql复合唯一键(LastName,FirstName,MiddleName)不起作用?

时间:2014-01-09 02:34:09

标签: 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'
        )
    )
);

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

1 个答案:

答案 0 :(得分:3)

记住基本规则:

NULL!= NULL or NULL <> NULL

即使两者都具有NULL值,也无法进行比较,因为它们未定义。 NULL并不等同。 NULL等于未定义。想想这就像NULL就像查克诺里斯一样,因为没有什么能比得上查克诺里斯。

因此你的钥匙:

Last1 NULL First1
Last1 NULL First1 

独特,因为NULLS无法比较。

要使其正常工作,请将NULL中间名默认为''字符串或零长度字符串。