Con*_*eer 6 sql postgresql plpgsql
我正在阅读Instagrams分片解决方案,我注意到以下行:
SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
Run Code Online (Sandbox Code Playgroud)
上面的SELECT行中的%%是做什么的?我查找了PostgreSQL,我发现的唯一一件事就是当你想使用字面百分比字符时使用%%.
CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
our_epoch bigint := 1314220021721;
seq_id bigint;
now_millis bigint;
shard_id int := 5;
BEGIN
SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
result := (now_millis - our_epoch) << 23;
result := result | (shard_id << 10);
result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
的唯一地方,我能想到的,这里%将在标准的Postgres被成倍上涨是里面format()的功能,常用于生产动态SQL查询字符串。在此处比较示例。
手册:
除了上述格式说明符外,特殊序列
%%还可用于输出文字%字符。
在动态语句中使用模运算符%时比较棘手!
我怀疑他们在幕后运行动态SQL-他们在本文中对其进行了概括和简化。(序列的模式限定名称为,'insta5.table_id_seq'并且该表将不会被命名为“表”。)在此过程中,他们忘记了对模运算符进行“转义”。
那就是他们实际上正在运行的东西:
EXECUTE format($$SELECT nextval('%I') %% 1024$$, seq_name)
INTO seq_id;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |