فرض فريدة من نوعها الصفوف في الخلية
-
01-07-2019 - |
سؤال
لدي جدول في MySQL
أن لديه 3 حقول أريد أن فرض تفرد بين اثنين من المجالات.هنا هو الجدول DDL
:
CREATE TABLE `CLIENT_NAMES` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
على ID
الميدان هو مركب مفتاح (هذا الجدول يتم تحميل مع ETL).على CLIENT_NAME
هو الحقل الذي يحتوي على أسماء العملاء
على OWNER_ID
هو معرف يشير إلى العملاء مالك.
اعتقدت أنني يمكن أن تطبق هذا مع فهرس فريد على CLIENT_NAME
و OWNER_ID
,
ALTER TABLE `DW`.`CLIENT_NAMES`
ADD UNIQUE INDEX enforce_unique_idx(`CLIENT_NAME`, `OWNER_ID`);
ولكن الخلية يعطيني خطأ:
خطأ في تنفيذ أوامر SQL لتحديث الجدول.المفتاح المحدد كانت طويلة جدا ؛ ماكس طول المفتاح هو 765 بايت (خطأ 1071)
أي شخص آخر لديك أي أفكار ؟
المحلول
الخلية لا يمكن فرض تفرد على المفاتيح التي هي أطول من 765 بايت (و على ما يبدو 500 UTF8 الشخصيات يمكن أن يتجاوز هذا الحد).
- لا CLIENT_NAME حقا بحاجة إلى أن تكون 500 حرف طويلا ؟ يبدو قليلا المفرطة.
- إضافة جديدة (أقصر) عمود التجزئة(CLIENT_NAME).الحصول على الخلية فرض تفرد على أن تجزئة بدلا من ذلك.
نصائح أخرى
هل نظرت في القيد ...فريدة من نوعها ؟
شيء يبدو غريبا بعض الشيء عن هذا الجدول ؛ أنا في الحقيقة التفكير في إعادة بيع ديون عليه.ماذا ID OWNER_ID الرجوع إلى ما هي العلاقة بينهما ؟
هل يعقل أن يكون
CREATE TABLE `CLIENTS` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
# other client fields - address, phone, whatever
PRIMARY KEY (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `CLIENTS_OWNERS` (
`CLIENT_ID` int(11) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY (`CLIENT_ID`,`OWNER_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
أنا حقا تجنب إضافة مفتاح فريد مثل هذا على 500 سلسلة أحرف.انها أكثر من ذلك بكثير فعالة لإنفاذ تفرد على اثنين من رجات ، بالإضافة إلى معرف في الجدول حقا ينبغي أن نشير إلى شيء يحتاج إلى معرف ؛ في الإصدار الخاص بك ، ID
يبدو أن مجال تحديد فقط العميل/المالك العلاقة التي لا تحتاج معرف منفصلة, منذ انها مجرد رسم الخرائط.
هنا.بالنسبة UTF8 محارف, الخلية يمكن استخدام ما يصل إلى 3 بايت لكل حرف.CLIENT_NAME هو 3 × 500 = 1500 بايت.تقصير CLIENT_NAME
250.
في وقت لاحق: +1 إلى إنشاء تجزئة اسم باستخدام مفتاح.