ورود

View Full Version : جلوگیری از تکراری بودن یک فیلد



Mohammadi_F
یک شنبه 29 بهمن 1385, 04:24 صبح
سلام
من جدولی دارم که یک فیلد کلید از نوع int داره و دو تا فیلد دیگه یکی از نوع textو دیگری از نوعint و چند تا فیلد دیگه که مهم نیست.
حالا می خوام مجموع این دو تا فیلد آخری که گفتم و فیلد کلید هم نیستند توی جدول unic باشه (تکراری نباشه).
بانک من از نوع Access و از دلفی 6 استفاده می کنم.
توضیح: کاربر فیلد اول رو که int و کلید بود نمی بینه و فقط خودم ازش استفاده می کنم ولی دوتا فیلد بعدی رو به عنوان یک فیلد می بینه.
متشکرم.

V60
یک شنبه 29 بهمن 1385, 04:36 صبح
یک کم بیشتر توضیح بده تا بتوان کمکت کرد؟ شاید بشود از یک کامپوننت جدول دیگر همان زمان که می خواهی تغییر را انجام بدهی استفاده کرد ، یعنی توسط اون چک کرد که همچین مقادیری یکبار ثبت شده یا نه . ولی به صورت کلی اگر بیشتر توضیح بدی بهتره ؟ چطور کاربر دو تافیلد را یک فیلد می بینه و چطور توش مقدار وارد می کنه که بعد دوباره از هم جدا می شوند ؟
از ماسک ادیت استفاده کردی و توسط کد اونها را از هم جدا می کنی؟
یک کم بیشتر توضیح بده.

nasr
یک شنبه 29 بهمن 1385, 07:55 صبح
می تونی قبل از Post کردن این اتفاق را با دستور Locate چک کنی.

Mohammadi_F
دوشنبه 30 بهمن 1385, 07:44 صبح
سلام
با سپاس از توجه دوستان
من برنامه ای رو نوشتم که یک بانک داره با حدود سه میلیون رکورد و نه فیلد، فیلد ایندکس این جدول یک فیلد متنی برای شماره پرونده است، شماره پرونده ها از دو قسمت تشکیل شده که یک قسمت حروف الفبا و قسمت دیگه اعداد مثبته. الان بعد از تحویل برنامه و وارد کردن اطلاعات موقع sort کردن برنامه بر اساس شماره پرونده ، چون شماره پرونده از نوع متنی انتخاب شده نتیجه دلخواه بوجود نمیاد یعنی مثلا پرونده "الف10"قبل از "الف2"قرار می گیرد که اصلا درست نیست و بنا بر درخواست مشتری قرار شد در ویرایش بعدی این مشکل حل بشه حالا به پیشنهاد یکی از دوستان یک فیلد عددی را به عنوان فیلد اصلی جدول انتخاب کردم که برای کاربر قابل رویت نباشه و فقط برای استفاده برنامه است و فیلد شماره پرونده رو هم به دو فیلد (یکی برای قسمت الفبا و یکی برای قسمت عددی ) تبدیل کردم .
الان مشکلی که دارم اینه که در موقع ایجاد یک فیلد جدید یا تغییر فیلدهای قبلی چطوری چک کنم که شماره پرونده تکراری نباشه چون دیگه این دو فیلد که برای ذخیره شماره پرونده ایجاد شدند فیلد اصلی نیستند که خود SQLSerever در صورت تکراری بودن پیام خطا بده.
ضمنا از locate هم نمی تونم استفاده کنم چون فکر کنم با سه میلیون رکورد چند دقیقه طول بکشه.
امیدوارم توضیحات شفاف باشه.
بازهم از توجهتون ممنونم
منتظر راهنماییهاتون هستم
موفق باشید

nasr
دوشنبه 30 بهمن 1385, 08:20 صبح
خوب چرا شما این دوتا فیلد را با هم Primary Key نمی کنی؟

Mohammadi_F
دوشنبه 30 بهمن 1385, 09:28 صبح
چون یک فیلد int رو به عنوان فیلد اصلی تعریف کردم که توی بقیه جدولها هم از اون استفاده میشه. و اگه بخوام این فیلد رو بردارم و دوتا فیلدی که شما گفتید رو به عنوان فیلد اصلی تعریف کنم استفادش توی جداول دیگه سخت میشه. بخاطر اینکه نمی خوام با تغییر یک جدول ،جداول دیگه نیاز به تغییر داشته باشه ولی اگه این دوتا فیلد رو به عنوان فیلد اصلی تعریف کنم با تغییر این فیلد بایستی تمام جداول دیگم رو که به این جدول وصل هستن و تعدادشون هم کم نیست تغییر بدم(update کنم) .به همین دلیله که فیلدی عددی رو تعریف کردم بر ای ارتباط بین جداول که هم کاربر نتونه اون رو تغییر بده و هم اینکه کار با فیلد عددی خیلی سریعتره.
ممنون از توجهتون.

Arash_Faridi
دوشنبه 30 بهمن 1385, 10:30 صبح
اگه مشکل فقط unique کردنه بهترین راه اینه که Index تعریف کنید . به وسیله دو فیلد مورد نظرت یک Index بساز و تیک مربوط به Create Unique را فعال کن و نوع را Constraint انتخاب کن ، در این صورت SQLServer در صورت تکراری بودن پیغام خطا می‌فرسته

Mohammadi_F
دوشنبه 30 بهمن 1385, 19:25 عصر
ممنون از جوابتون
امتحان می کنم
فکر کنم مشکلم با این روش حل بشه
باز هم ممنون