create_table :users do |t|
t.string :email, null: false
t.string :username, null: false
t.string :display_name, null: false
t.string :password_digest, null: false
t.integer :status, default: 0, null: false
t.string :security_question
t.string :security_answer_digest
t.string :password_reset_token
t.datetime :password_reset_sent_at
t.string :auth_token
t.timestamps
end
add_index :users, :email, unique: true
add_index :users, :username, unique: true
add_index :users, :auth_token, unique: true, nulls_not_distinct: true
add_index :users, :password_reset_token, unique: true, nulls_not_distinct: true
测试一直跑不过,看了日志,数据库报错 duplicate key value。然后,直接在 Pg 里面去试试。
-- 1. 创建测试表
DROP TABLE IF EXISTS test_nulls_distinct;
CREATE TABLE test_nulls_distinct (
id SERIAL PRIMARY KEY,
data TEXT
);
-- 2. 创建带 NULLS NOT DISTINCT 的唯一索引
CREATE UNIQUE INDEX idx_test_data_unique
ON test_nulls_distinct (data)
NULLS NOT DISTINCT;
-- 3. 插入测试数据
-- 插入唯一非 NULL 值 (应该成功)
INSERT INTO test_nulls_distinct (data) VALUES ('A');
INSERT INTO test_nulls_distinct (data) VALUES ('B');
-- 插入多个 NULL 值 (这应该成功,因为 NULLS NOT DISTINCT)
INSERT INTO test_nulls_distinct (data) VALUES (NULL);
INSERT INTO test_nulls_distinct (data) VALUES (NULL);
-- 执行上面这行应该会报错:
-- ERROR: duplicate key value violates unique constraint "idx_test_data_unique"
-- DETAIL: Key (data)=(NULL) already exists.
有没有同学解决过这个问题,网上搜索了半天资料,都是说会遇到错误都是 Pg 版本低,我一开始用 16,最后换到 latest,还是一样。