كيف يمكنني تطبيق قيود فقط إذا كان العمود غير فارغ في postgresql؟

StackOverflow https://stackoverflow.com/questions/579710

سؤال

أرغب في حلا لفرض قيود فقط إذا كان العمود غير فارغ. لا أستطيع أن أجد طريقة للقيام بذلك في الوثائق.

create table mytable(
  table_identifier_a INTEGER,
  table_identifier_b INTEGER,
  table_value1,...)

افعل طبيعة البيانات، سأحصل على معرف B وقيمة عند إنشاء الجدول. بعد استلامنا بيانات إضافية، سأكون قادرا على ملء المعرف أ. في هذه المرحلة أود أن ضمان unique key of (identifier_a, value1) ولكن فقط إذا كان معرف_A موجود.

نأمل أن يكون ذلك منطقي، أي واحد لديه أي أفكار؟

هل كانت مفيدة؟

المحلول

ummm. القيود الفريدة لا تمنع القيم الخالية متعددة.

CREATE TABLE mytable (
    table_identifier_a   INTEGER    NULL,
    table_identifier_b   INTEGER    NOT NULL,
    table_value1         INTEGER    NOT NULL,

    UNIQUE(table_identifier_a, table_identifier_b)
);

لاحظ أنه يمكننا إدراج muliple nulls في ذلك، حتى عند مطابقات المعرف:

test=# INSERT INTO mytable values(NULL, 1, 2);
INSERT 0 1
test=# INSERT INTO mytable values(NULL, 1, 2);
INSERT 0 1
test=# select * from mytable;
 table_identifier_a | table_identifier_b | table_value1 
--------------------+--------------------+--------------
                    |                  1 |            2
                    |                  1 |            2
(2 rows)

لكن لا يمكننا إنشاء أزواج مكررة (أ، ب):

test=# update mytable set table_identifier_a = 3;
ERROR:  duplicate key value violates unique constraint "mytable_table_identifier_a_key"

بالطبع، لديك مشكلة: الجدول الخاص بك ليس لديه مفتاح أساسي. ربما لديك مشكلة نموذج البيانات. لكنك لم تقدم تفاصيل كافية لإصلاح ذلك.

نصائح أخرى

إذا كان من الممكن إكمال العملية بأكملها ضمن معاملة واحدة، فمن الممكن تغيير الوقت الذي يقيمه بعد الحوارق القيد، أي:

START;
SET CONSTRAINTS <...> DEFERRED;
<SOME INSERT/UPDATE/DELETE>
COMMIT;

في هذه الحالة، يتم تقييم القيد عند الالتزام. يرى:Postgres 7.4 Doc - ضبط القيود أو postgres 8.3 Doc.

في الواقع، ربما سأكسر هذا إلى طاولتين. أنت نمذجة نوعين مختلفين من الأشياء. أول واحد هو الإصدار الأولي، وهو جزئي فقط، والثاني هو كل شيء كله. بمجرد أن تكون المعلومات اللازمة لجلب النوع الأول من الشيء إلى الثاني، حرك الصف من جدول إلى آخر.

يمكنك التعامل مع هذا باستخدام الزناد بدلا من قيد.

إذا كنت أنت كنت، فسأقسم الجدول إلى جدولين، وربما إنشاء طريقة عرض تجمع بينها حسب الحاجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top