سؤال

لدي جدول في 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 الشخصيات يمكن أن يتجاوز هذا الحد).

  1. لا CLIENT_NAME حقا بحاجة إلى أن تكون 500 حرف طويلا ؟ يبدو قليلا المفرطة.
  2. إضافة جديدة (أقصر) عمود التجزئة(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 إلى إنشاء تجزئة اسم باستخدام مفتاح.

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