我正在使用 PostgreSQL 12。我有一個'users'表,其中'email'列可以為空意味著可選列,但是它具有預期的唯一約束。這個“email”列是“citext”型別的列。
問題是即使我將 'email' 值發送為NULL,資料庫在插入期間將其保存為空字串而不是 NULL 'email' 列。有什么方法可以在插入或更新時將“電子郵件”列的空字串轉換為 NULL?因為它有唯一約束,如果多個用戶沒有提供'email',它需要為NULL以避免唯一約束錯誤。
我正在使用 PHP Laravel 框架。沒有定義突變器。控制器部分如下:
var_dump($user->email); // email is null still
$success = $user->save(); // save DB changes by ORM
var_dump($user->email); // is '' string now, NULL expected
我希望轉換應該在后臺或由 PostgreSQL 本身在插入或更新期間自動發生。可能是我們可以在自動轉換的列中定義的“CHECK”約束?
提前致謝。
uj5u.com熱心網友回復:
不,正如@a_horse_with_no_name 所指出的,檢查約束無濟于事。這是一個觸發器定義,可以解決您的情況。
create or replace function emailfix_tf()
returns trigger language plpgsql as
$$
begin
new.email := nullif(trim(new.email), '');
return new;
end;
$$;
create trigger users_emailfix_t
before insert or update on users
for each row execute procedure emailfix_tf();
無論如何,很遺憾您必須定義觸發器以修復被 ORM 格式錯誤和損壞的資料。
uj5u.com熱心網友回復:
你可以使用 NULLIF()
INSERT INTO your_table (cols..., email) VALUES (..., NULLIF(your_email, ''))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399534.html
標籤:sql 拉拉维尔 PostgreSQL的 铸件
