58 lines
2.2 KiB
PL/PgSQL
58 lines
2.2 KiB
PL/PgSQL
-- 设备推送标识(cid)注册表
|
|
-- 用于:通知服务按 user_id 查找当前用户的设备 client id,推送时调用 uniCloud sendMessage。
|
|
--
|
|
-- 设计要点:
|
|
-- - cid 由 App 端调用 uni.getPushClientId 获取后上报,此处持久化以便后续推送查找。
|
|
-- - cid 全局唯一(同一设备多次注册会被覆盖为同一行);user_id+cid 联合索引方便按用户反查。
|
|
-- - active=false 表示该设备已下线(用户主动登出、token 失效等),推送时按 active=TRUE 过滤。
|
|
-- - 序列起始 10000:为测试数据/手动 INSERT 预留。
|
|
|
|
BEGIN;
|
|
|
|
CREATE TABLE IF NOT EXISTS public.user_devices (
|
|
id BIGINT NOT NULL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL,
|
|
cid VARCHAR(128) NOT NULL,
|
|
platform VARCHAR(20) NOT NULL DEFAULT '',
|
|
app_version VARCHAR(32) NOT NULL DEFAULT '',
|
|
device_model VARCHAR(64) NOT NULL DEFAULT '',
|
|
active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at BIGINT NOT NULL,
|
|
updated_at BIGINT NOT NULL
|
|
);
|
|
|
|
-- cid 全局唯一
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_user_devices_cid
|
|
ON public.user_devices(cid);
|
|
|
|
-- 按用户查询活跃设备
|
|
CREATE INDEX IF NOT EXISTS idx_user_devices_user_active
|
|
ON public.user_devices(user_id) WHERE active = TRUE;
|
|
|
|
-- 序列:预留给测试/手动 insert
|
|
CREATE SEQUENCE IF NOT EXISTS user_devices_id_seq START WITH 10000;
|
|
|
|
-- 关键:把 id 列绑到 sequence,否则 INSERT 不传 id 会触发 SQLSTATE 23502
|
|
-- (id 没有 default → PG 不知道怎么填 → 报错 → 上游 RegisterDevice 500)
|
|
-- 旧版只 CREATE SEQUENCE + setval,漏了 ALTER COLUMN,2026-06-17 线上炸过
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_schema = 'public'
|
|
AND table_name = 'user_devices'
|
|
AND column_name = 'id'
|
|
AND (column_default IS NULL OR column_default = '')
|
|
) THEN
|
|
ALTER TABLE public.user_devices
|
|
ALTER COLUMN id SET DEFAULT nextval('user_devices_id_seq'::regclass);
|
|
END IF;
|
|
END $$;
|
|
|
|
-- 同步序列(防止已有数据场景下序列落后)
|
|
SELECT setval(
|
|
'user_devices_id_seq',
|
|
GREATEST(10000, (SELECT COALESCE(MAX(id), 0) FROM public.user_devices))
|
|
);
|
|
|
|
COMMIT; |