لینک کوتاه مطلب : https://hsgar.com/?p=5231

Postgres 15 UNIQUE و NULL را بهبود می بخشد

توسط رایان لمبرت — منتشر شده در 11 ژوئیه 2022

Postgres 15 beta 2 منتشر شد
به تازگی! من از فصل بتا لذت می برم… بررسی و آزمایش ویژگی های جدید یک انحراف سرگرم کننده از کارهای روزانه است. این پست نگاهی به بهبودی دارد UNIQUE محدودیت های ستون ها با NULL ارزش های. در حالی که تفاوت‌های ظریف محدودیت‌های منحصربه‌فرد به این اندازه جذاب نیستند مرتب کردن سریعتر (این هیجان انگیز است!)، بهبود کنترل توسعه دهنده پایگاه داده بر کیفیت داده ها همیشه یک مزیت خوب است.

این زنجیره ایمیل
سابقه این تغییر را دارد. این
یادداشت های انتشار Postgres 15
این بهبود را خلاصه کنید:

به محدودیت‌ها و شاخص‌های منحصربه‌فرد اجازه دهید تا مقادیر NULL را غیرمتمایز تلقی کنند (پیتر آیسنترات)

قبلا NULL مقادیر همیشه به عنوان مقادیر متمایز نمایه می شدند، اما اکنون می توان با ایجاد محدودیت ها و شاخص ها با استفاده از UNIQUE NULLS NOT DISTINCT

دو سبک از UNIQUE

برای اینکه ببینیم این تغییر چه می کند، دو جدول ایجاد می کنیم. این null_old_style جدول دارای 2 ستون می باشد UNIQUE محدودیت در (val1, val2). این val2 اجازه می دهد NULL ارزش های.

CREATE TABLE null_old_style
(
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    val1 TEXT NOT NULL,
    val2 TEXT NULL,
    CONSTRAINT uq_val1_val2
        UNIQUE (val1, val2)
);

این null_new_style جدول از گزینه جدید استفاده می کند: UNIQUE NULLS NOT DISTINCT. تنها تفاوت با جدول قبلی اضافه کردن نحو جدید برای محدودیت منحصر به فرد است.

CREATE TABLE null_new_style
(
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    val1 TEXT NOT NULL,
    val2 TEXT NULL,
    CONSTRAINT uq_val1_val2_new
        UNIQUE NULLS NOT DISTINCT (val1, val2)
);

تغییر در داده های مجاز

در Postgres 14 و قبل از آن، محدودیت‌های منحصربه‌فرد بررسی شد NULL مقادیری که با سایرین برابر نیستند NULL ارزش های. از
Postgres 14 Docs:

هنگامی که یک شاخص منحصر به فرد اعلام می شود، چندین ردیف جدول با مقادیر نمایه شده یکسان مجاز نیستند. مقادیر صفر برابر در نظر گرفته نمی شوند.

این با مدیریت استاندارد SQL سازگار است NULL به طور کلی، کجا NULL ناشناخته است. تعیین اینکه آیا یک مجهول مساوی با مجهول دیگر است غیرممکن است. زیرا NULL ارزش‌ها با یکدیگر برابری ناشناخته هستند، آنها نقض نمی‌کنند UNIQUE محدودیت ها. این با اضافه کردن 5 ردیف یکسان به نشان داده شده است null_old_style جدول.

INSERT INTO null_old_style (val1, val2)
SELECT 'Hello', NULL
    FROM generate_series(1, 5)
;

SELECT * FROM null_old_style;

id|val1 |val2|
--+-----+----+
 1|Hello|    |
 2|Hello|    |
 3|Hello|    |
 4|Hello|    |
 5|Hello|    |

این رفتار مستند و مورد انتظار است و حتی بخشی از استاندارد ANSI SQL است. با این حال، من هرگز رفتار فوق را دوست نداشتم زیرا به اندازه کافی محدود کننده نیست.

با جدید NULLS NOT DISTINCT گزینه، محدودیت منحصر به فرد با عدم اجازه تکرار محدودتر است NULL ارزش های. برای شروع یک ردیف اضافه کنید.

INSERT INTO null_new_style (val1, val2)
SELECT 'Hello', NULL;

SELECT * FROM null_new_style;

id|val1 |val2|
--+-----+----+
 1|Hello|    |

تلاش برای افزودن ردیف دوم با 'Hello' که در val1 و NULL که در val2
اکنون منجر به نقض محدودیت منحصر به فرد می شود.

INSERT INTO null_new_style (val1, val2)
SELECT 'Hello', NULL;

SQL Error [23505]: ERROR: duplicate key value violates unique constraint "uq_val1_val2_new"
  Detail: Key (val1, val2)=(Hello, null) already exists.

البته، تغییر ارزش در val1 به یک مقدار جدید دیگر اجازه می دهد NULL اضافه شود val2.

INSERT INTO null_new_style (val1, val2)
SELECT 'World', NULL;

id|val1 |val2|
--+-----+----+
 1|Hello|    |
 3|World|    |

این با مدل ذهنی من مطابقت دارد که چگونه فکر می کنم محدودیت های منحصر به فرد باید با مقادیر صفر کار کنند.

خلاصه

من خوشحالم که اضافه شده است UNIQUE NULLS NOT DISTINCT در Postgres 15 آمده است. این یک سطح اضافی از کنترل کیفیت را به Postgres اضافه می کند. همچنین این یک تغییر کم تاثیر است زیرا عملیات پیش‌فرض به همان شکلی که بوده ادامه خواهد داشت.

برای سرورها یا پایگاه داده های PostgreSQL خود به کمک نیاز دارید؟
با ما تماس بگیرید
برای شروع گفتگو!

نوشته رایان لمبرت
منتشر شده در 11 جولای 2022
آخرین به روز رسانی 11 جولای 2022

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.