ورود

View Full Version : شماره های اتومات در sql



mohammad1314
دوشنبه 17 فروردین 1394, 18:01 عصر
سلام دوستان.

من در جدولم یه ستون به نام code دارم که از نوع int هستش و خاصیت identity increament اون true هست تا یکی یکی به صورت اتومات بره بالا.

اگه من پنج تا رکورد داشته باشم و من رکورد 5 رو حذف کنم و بعدش اگه یه رکورد دیگه اضافه کنم ، شماره ستون code میشه 6 .
حالا من نمیخوام همچی اتفاقی بیفته. یعنی اگه رکوردی رو از هرجای جدول حذف کردم ، شماره های دیگه به ترتیب و پشت سر هم بشن.
(در ضمن مهم هم نیست که کدوم کد برای کدوم ستون باشه ، فقط پشت سر هم باشه.)
ممنون میشم کمکم کنین.

SabaSabouhi
سه شنبه 18 فروردین 1394, 11:42 صبح
سلام دوستان.

من در جدولم یه ستون به نام code دارم که از نوع int هستش و خاصیت identity increament اون true هست تا یکی یکی به صورت اتومات بره بالا.

اگه من پنج تا رکورد داشته باشم و من رکورد 5 رو حذف کنم و بعدش اگه یه رکورد دیگه اضافه کنم ، شماره ستون code میشه 6 .
حالا من نمیخوام همچی اتفاقی بیفته. یعنی اگه رکوردی رو از هرجای جدول حذف کردم ، شماره های دیگه به ترتیب و پشت سر هم بشن.
(در ضمن مهم هم نیست که کدوم کد برای کدوم ستون باشه ، فقط پشت سر هم باشه.)
ممنون میشم کمکم کنین.

سلام
شما از ابزار نادرستی استفاده کردی.
Identity برای Id هست. منظورم کلید اصلی جدول هست که وظیفه‌اش فقط و فقط کلید اصلی بودنه.
برای اون ستون code بجای استفاده از identity از trigger استفاده کن. نوع ستون رو Nullable بگذار.
هنگام اضافه کردن بیشترین مقدار رو پیدا کن و خودت مقدار دهی کن
هنگام حذف کردن مقدار این ستون تو سطرهای بعدی رو کم کن.

در حاشیه: اگه منظورت از این ستون، «ردیف» هست. راه‌کار خوبی رو انتخاب نکردی.

صبا صبوحی

soheileee
دوشنبه 24 فروردین 1394, 03:49 صبح
اگه می خوای برای گزارش گیری شماره سطر داشته باشی یه راه خیلی ساده هست:

فرض کن جدول شما داری 2 تا column هست، ID که همون Identity هست که تعریف کردی و Name.
برای درست کردن یه Table واسه تست سکریپت زیر رو اجرا کن:

CREATE TABLE PERSON (ID INT IDENTITY PRIMARY KEY, NAME VARCHAR(MAX))


INSERT INTO PERSON (NAME) VALUES ('ALI')
INSERT INTO PERSON (NAME) VALUES ('MAJID')
INSERT INTO PERSON (NAME) VALUES ('REZA')
INSERT INTO PERSON (NAME) VALUES ('MAHMOUD')
INSERT INTO PERSON (NAME) VALUES ('ABBAS')
INSERT INTO PERSON (NAME) VALUES ('BIJAN')
INSERT INTO PERSON (NAME) VALUES ('GHOLI')

اگه جدول بالا رو Select * from Person کنی این جواب رو می بینی:



ID NAME
1 ALI
2 MAJID
3 REZA
4 MAHMOUD
5 ABBAS
6 BIJAN
7 GHOLI


حالا داده های سطرهای 3 و 6 رو حذف می کنیم:


DELETE FROM PERSON
WHERE ID IN (3, 6)


دوباره Select میزنیم و نتیجه اینه:


ID NAME
1 ALI
2 MAJID
4 MAHMOUD
5 ABBAS
7 GHOLI


حالا شما می خوای شماره سطر بدی بهش، Query شما اینجوری می شه:



SELECT ID
, NAME
, ROW_NUMBER() OVER(ORDER BY NAME) SEQUENCE
FROM PERSON




جوابی که می بینی اینه:




ID NAME SEQUENCE
5 ABBAS 1
1 ALI 2
7 GHOLI 3
4 MAHMOUD 4
2 MAJID 5


زیر ستون Sequence شماره سطر داری.
بدون درد و خونریزی!

ghasem110deh
سه شنبه 25 فروردین 1394, 16:28 عصر
سلام به همه ...
میخوام شماره اولین سطر از 1000 شروع بشه و 5 تا ، 5 تا بره جلو ...
یعنی اولین سطر بشه 1000 بعدی 1005 ، بعدی 1010 و همینطور تا آخر !
اینکارو انجام دادم ولی هیچ اتفاقی نمیوفته : (عکس ضمیمه)

SabaSabouhi
سه شنبه 25 فروردین 1394, 16:53 عصر
سلام به همه ...
میخوام شماره اولین سطر از 1000 شروع بشه و 5 تا ، 5 تا بره جلو ...
یعنی اولین سطر بشه 1000 بعدی 1005 ، بعدی 1010 و همینطور تا آخر !
اینکارو انجام دادم ولی هیچ اتفاقی نمیوفته : (عکس ضمیمه)

سلام
دقیقاً برعکس انجام دادی.
اگه هیچ رکوردی وجود نداره، اولین مقدار رو از Seed بر می‌داره. و هر بار به آخرین مقداری که برای این ستون وجود داره
مقدار Identity Increment رو اضافه می‌کنه.
مقدار رو درست بده، حتماً باید کار کنه.

صبا صبوحی

ghasem110deh
سه شنبه 25 فروردین 1394, 17:01 عصر
ممنون ...
با توضیحات شما ... الان باید از 5 شروع بشه و هربار 1000 بهش اضافه کنه !؟
ولی کلا از 1 شروع میشه و یکی یکی میره بالا !!!

soheileee
سه شنبه 25 فروردین 1394, 23:22 عصر
ممنون ...
با توضیحات شما ... الان باید از 5 شروع بشه و هربار 1000 بهش اضافه کنه !؟
ولی کلا از 1 شروع میشه و یکی یکی میره بالا !!!

بالاخره می خوای از 1000 شروع بشه و 5تا 5تا بهش اضافه بشه یا از 5 شروع بشه و 1000 تایی بالا بره؟!

روش زیر رو انجام بده برای موردی که می خوای از 1000 شروع بشه و 5تایی بالا بره:

جدول قبلی رو پاک کن.
در کد زیر بجای YOUR_TABLE نام مورد نظر خودت رو بذار و کد رو اجرا کن



CREATE TABLE YOUR_TABLE(ID INT IDENTITY(1000,5), NAME VARCHAR(MAX))




اگه می خوای از 5 شروع بشه و 1000تایی بالا بره در کد بالا جای اعداد 5 و 1000 رو عوض کن.

البته این رو هم بگم که دلیل یه چنین درخواستی از نظر تکنیکال برام روشن نیست، چون اگه شما یه سطر رو پاک کنی، اون سطر برای همیشه رفته و سطرهای جدیدی که اضافه می کنی از ادامه آخرین شماره بالا خواهد رفت و عملاً اون ترتیب و توالی که می خوای از بین میره.
از طرفی کلاً این کار چه فایده ای داره؟
کلاً Identity ساخته شده برای اینکه شما بتونی به سادگی یه کاندیدا برای Primary Key داشته باشی.

SabaSabouhi
چهارشنبه 26 فروردین 1394, 08:24 صبح
ممنون ...
با توضیحات شما ... الان باید از 5 شروع بشه و هربار 1000 بهش اضافه کنه !؟
ولی کلا از 1 شروع میشه و یکی یکی میره بالا !!!

سلام
در کل وجود ابزار راحت ( مثل Management Studio ) همیشه این مشکل رو ایجاد می‌کنن که
کاربر متوجه نشه واقعاً چی شده.
شما برای این که هم خودت دقیق متوجه بشی که چرا درست کار نمی‌کنه هم ما روشن بشیم
که شما چیکار کردی، از این جدول یک script بگیر و اینجا کپی کن.
چون چیزی که شما نشون دادی، باید کار کنه.

صبا صبوحی

ghasem110deh
چهارشنبه 26 فروردین 1394, 11:26 صبح
از 1000 شروع و 5 تا ، 5 تا بره بالا ... خیلی هم مهم نیست رقم (میخوام ارقام عادی آیدنتیتی نباشه ... یعنی از 1 الی آخر)


از طرفی کلاً این کار چه فایده ای داره؟

دو تا جدول دارم ... Agent - Cost که با هم در ارتباط هستن ، نمیخوام آیدی سطرهاشون یکی باشه ؛
چون یه view باید شماره آیدی هر دو جدول رو نشون بدم !


که شما چیکار کردی، از این جدول یک script بگیر و اینجا کپی کن.
چون چیزی که شما نشون دادی، باید کار کنه.

جدول رو پاک کردم و دوباره ایجاد کردم ...

-------------------------------------------

روش درستی واسه این کاری که میخوام انجام بدم هست ؟

نمیخوام آیدی سطرهاشون یکی باشه ؛
چون یه view باید شماره آیدی هر دو جدول رو نشون بدم !

SabaSabouhi
چهارشنبه 26 فروردین 1394, 12:47 عصر
از 1000 شروع و 5 تا ، 5 تا بره بالا ... خیلی هم مهم نیست رقم (میخوام ارقام عادی آیدنتیتی نباشه ... یعنی از 1 الی آخر)



دو تا جدول دارم ... Agent - Cost که با هم در ارتباط هستن ، نمیخوام آیدی سطرهاشون یکی باشه ؛
چون یه view باید شماره آیدی هر دو جدول رو نشون بدم !



جدول رو پاک کردم و دوباره ایجاد کردم ...

-------------------------------------------

روش درستی واسه این کاری که میخوام انجام بدم هست ؟

سلام
کاش از اول صورت مساله رو گفته بودی.
این کاری که داری می‌کنی کاملاً کار اشتباهی هست. برای این کار روش‌های به‌تری هم وجود داره.
من ترجیح می‌دم یه جدول مشترک داشته باشم که حاوی اون کلید اصلی یکتا باشه. و دو جدول شما
یک کلید اصلی به صورت عادی ( بدون Identity ) داشته باشه که ضمن کلید اصلی بودن، کلید خارجی به
کلید اصلی اون جدول مادر باشه. یه چیزی مثل BaseClass که دو تا کلاس ازش ارث می‌برن.
کار اضافی که باید انجام بدی اینه که برای هر سطری که می‌خوای اضافه کنی، باید به‌جای یک جدول
توی دو تا جدول رکورد رو اضافه کنی.
این‌طوری دیگه به این مشکل برخورد نمی‌کنی.

صبا صبوحی

soheileee
پنج شنبه 27 فروردین 1394, 01:28 صبح
از 1000 شروع و 5 تا ، 5 تا بره بالا ... خیلی هم مهم نیست رقم (میخوام ارقام عادی آیدنتیتی نباشه ... یعنی از 1 الی آخر)



دو تا جدول دارم ... Agent - Cost که با هم در ارتباط هستن ، نمیخوام آیدی سطرهاشون یکی باشه ؛
چون یه view باید شماره آیدی هر دو جدول رو نشون بدم !



جدول رو پاک کردم و دوباره ایجاد کردم ...

-------------------------------------------

روش درستی واسه این کاری که میخوام انجام بدم هست ؟

اگه نمی خوای IDها شبیه باشن، چرا یه Computed Column به هر کدوم از Tableها Add نکنی که متشکل از ID باشه با یه String برای شناسایی سریع IDها از هم؟

مثلاً فرض کن کلمات "Cost" و "Agent" رو به ID اضافه کنی. فکر کنم مشکل حل بشه.

برای این کار کافیه یه چیزی شبیه این رو اجرا کنی:



ALTER TABLE COST ADD ALIAS_ID AS (CONCAT('COST',[ID]))
GO
ALTER TABLE AGENT ADD ALIAS_ID AS (CONCAT('AGENT',[ID]))
GO

soheileee
پنج شنبه 27 فروردین 1394, 02:17 صبح
یادم رفت بگم که دستور CONCAT در SQL SERVER 2012 به بعد موجوده، اگه از 2008 یا قبل تر استفاده می کنی باید ID رو Convert کنی و بعد به رشته مورد نظرت الحاقش کنی.