Slide 1

Slide 1 text

第50回 PostgreSQLアンカンファレンス@オンライン Yasuo Honda @yahonda NOT VALIDな検査制約

Slide 2

Slide 2 text

● Yasuo Honda @yahonda ○ Rails committer ○ 第46回 PostgreSQLアンカンファレンス 以来4回目の参加です ■ PostgreSQL 15とRailsと - Speaker Deck ■ 遅延可能な一意性制約 - Speaker Deck ■ pg_stat_statementsで inの数が違うSQLをまとめて ほしい - Speaker Deck 自己紹介

Slide 3

Slide 3 text

● Ruby on Railsのmigration DSLで検査制約を作る2つの方法 ○ テーブル作成後に、`add_check_constraint`で作成 ○ テーブル作成時に`t.check_constraint`で作成 ● いずれも`:validate` 引数を設定可能(デフォルトはtrue) ○ falseを渡すと、無効な検査制約として作成される意図(NOT VALID) だった意図通りは`add_check_constraint`のみ ○ https://api.rubyonrails.org/classes/ActiveRecord/Connecti onAdapters/SchemaStatements.html#method-i-add_chec k_constraint 背景

Slide 4

Slide 4 text

● add_check_constraint ○ CREATE TABLE "posts" ("id" bigserial primary key, "title" character varying); ○ ALTER TABLE "posts" ADD CONSTRAINT posts_const CHECK (char_length(title) >= 5) NOT VALID; ● check_constraint ○ CREATE TABLE "comments" ("id" bigserial primary key, "body" text, CONSTRAINT comments_const CHECK (char_length(body) >= 5) NOT VALID); 発行されていた SQL https://gist.github.com/yahonda/7e61f3f71 681cfa03111fed55714b0b4

Slide 5

Slide 5 text

● alter tableで別に作成した方は意図どおり、not valid ● create table内で作成した方は、意図に反してvalid ● リンク 作成された検査制約の状態

Slide 6

Slide 6 text

● 検査制約のNOT VALIDをalter tableのみで追加できるのは意図した振 る舞いのよう(フォント赤字は筆者) ● https://www.postgresql.org/docs/current/sql-altertable.html ○ > This form adds a new constraint to a table using the same constraint syntax as CREATE TABLE, plus the option NOT VALID, which is currently only allowed for foreign key and CHECK constraints. ● https://www.postgresql.org/docs/9.2/release-9-2.html で追加 解釈

Slide 7

Slide 7 text

● create table時にnot validオプションはエラーになって欲しい ● 関連する議論 ○ https://www.postgresql.org/message-id/CAEZATCX8u8GU -M_DFtjksRUQhwm8zur3BQvLamFUX8MwYNntPg%40mail. gmail.com ● Rails側での追加対応も考えたい(今日のトピック外) 疑問

Slide 8

Slide 8 text

● PostgreSQL 18 devel(資料作成時のmasterブランチ) ○ https://github.com/postgres/postgres/commit/39240bcad 56dc51a7896d04a1e066efcf988b58f ● Rails main ○ https://github.com/rails/rails/commit/3a91006d22fa465fb ce41370bbe66aa332bdcc2d ● Red Hat Enterprise Linux release 9.5 (Plow) 環境

Slide 9

Slide 9 text

● https://github.com/rails/rails/pull/40192 ● https://github.com/rails/rails/issues/53732 ● https://github.com/rails/rails/pull/53735 ● https://www.postgresql.org/docs/current/catalog-pg-constrai nt.html ● https://www.postgresql.org/message-id/E1QcJd3-0001HT-91% 40gemulon.postgresql.org ● https://github.com/postgres/postgres/commit/897795240cfaa ed724af2f53ed2c50c9862f951f ● 参照

Slide 10

Slide 10 text

● pgsql-hackersにて2024年12月5日から下記の議論が始まっていること を教えていただきました ○ https://www.postgresql.org/message-id/CACJufxEQcHNh [email protected] ail.com ○ 内容確認してreplyしてみます 発表後の補足

Slide 11

Slide 11 text

おわり

Slide 12

Slide 12 text

おわり