PDA

View Full Version : انتقال تمام رکوردهای یک جدول به جدول دیگر



md3848
سه شنبه 05 شهریور 1398, 16:41 عصر
توجه : دیتابیس دو جدول یکسان هستش، ستون های دو جدول هم یکسان هستش، فقط میخوام تمام رکوردهای یک جدولو انتقال بدم به جدول دیگه.

سرچ هایی که کردم - باید از دستور زیر استفاده کنم :
string sqlString = "INSERT INTO " + newTableName + " SELECT * FROM " + currectTableName;

اما مشکلی که دارم اینه که اینه که میگه id تکراری هستش ( تو هر جدول 1 رکورد دارم_فعلا برای تست_ که خب ID شون 0 هستش )

System.Data.SqlClient.SqlException: 'Violation of PRIMARY KEY constraint 'PK__LeitnerC__3213E83FC358E792'. Cannot insert duplicate key in object 'dbo.LeitnerCategory0'. The duplicate key value is (0). The statement has been terminated.'

danialafshari
سه شنبه 05 شهریور 1398, 18:50 عصر
با سلام
به جای * از نام فیلدها استفاده کنید و فیلد ID رو قرار ندید
INSERT INTO dbo.Employees SELECT FirstName, LastName
FROM dbo.Persons;

md3848
سه شنبه 05 شهریور 1398, 19:09 عصر
string sqlString = "INSERT INTO " + newTableName + " (word, mean, imageURL, homeLVL, dateRead) SELECT word, mean, imageURL, homeLVL, dateRead FROM " + currectTableName + ";";

خب الان میگه فیلد ID نمیتونه NULL باشه :
: 'Cannot insert the value NULL into column 'id', table 'C:\USERS\DMF313\DESKTOP\LEITNER\LEITNER\DATABASEW ORDS.MDF.dbo.LeitnerCategory0'; column does not allow nulls. INSERT fails.


این فیلد PRIMARY KEY هستش؛ کد کامل تعریف جداولم به صورت زیره :
CREATE TABLE [dbo].[LeitnerCategory0] ( [id] INT NOT NULL,
[word] NVARCHAR (MAX) NOT NULL,
[mean] NVARCHAR (MAX) NOT NULL,
[imageURL] NVARCHAR (MAX) NULL,
[homeLVL] INT DEFAULT ((1)) NOT NULL,
[dateRead] DATE NOT NULL,
PRIMARY KEY CLUSTERED ([id] ASC)
);

danialafshari
سه شنبه 05 شهریور 1398, 19:13 عصر
[ID] [int] IDENTITY(1,1) NOT NULL

بعدشم من تست کردم مشکلی نداشت !
CREATE TABLE [dbo].[LeitnerCategory0] ( [id] INT NOT NULL,
[word] NVARCHAR (MAX) NOT NULL,
[mean] NVARCHAR (MAX) NOT NULL,
[imageURL] NVARCHAR (MAX) NULL,
[homeLVL] INT DEFAULT ((1)) NOT NULL,
PRIMARY KEY CLUSTERED ([id] ASC)
);
GO
CREATE TABLE [dbo].[LeitnerCategory1] (
[id] INT NOT NULL,
[word] NVARCHAR (MAX) NOT NULL,
[mean] NVARCHAR (MAX) NOT NULL,
[imageURL] NVARCHAR (MAX) NULL,
[homeLVL] INT DEFAULT ((1)) NOT NULL,
PRIMARY KEY CLUSTERED ([id] ASC)
);
GO


INSERT INTO [dbo].[LeitnerCategory1]
SELECT
[id] ,
[word] ,
[mean] ,
[imageURL] ,
[homeLVL]
FROM [dbo].[LeitnerCategory0]
GO

md3848
سه شنبه 05 شهریور 1398, 19:45 عصر
یه سوال - فرقی بین id و ID و Id هستش یا مشکل از استفاده نکردن من از کد (IDENTITY(1,1 هستش؟

danialafshari
سه شنبه 05 شهریور 1398, 20:02 عصر
فرقی ندارن
اگر برای جدول مقصد IDENTITY تعیین کنید و در هنگام ارسال ID رو نفرستید با ارور پست 1 مواجهه نمیشید ولی داده تکراری ذخیره میشه
یک راهی که به نظرم با ارسال ID میرسه این هست که قبلش محتویات جدول رو DELETE یا TRUNCATE کنید
یا اینکه از LIMIT - TOP - WHERE استفاده کنید

Mahmoud.Afrad
سه شنبه 05 شهریور 1398, 21:13 عصر
توجه : دیتابیس دو جدول یکسان هستش، ستون های دو جدول هم یکسان هستش، فقط میخوام تمام رکوردهای یک جدولو انتقال بدم به جدول دیگه.
......


اصلا چرا ؟!!

md3848
سه شنبه 05 شهریور 1398, 21:36 عصر
برنامه مربوطه به لایتنر - کاربر میتونه چندین گروه ایجاد کنه - هر گروه، لغات خودشو داره و به طبع جدول خودشو - حالا کاربر خواست گروه رو حذف کنه - چه بلایی سر لغات بیاد؟ بله منتقل میشه به یه گروه دیگه و یا حذف میشه لغات ( بسته به نظر کاربر )

Mahmoud.Afrad
چهارشنبه 06 شهریور 1398, 00:44 صبح
برنامه مربوطه به لایتنر - کاربر میتونه چندین گروه ایجاد کنه - هر گروه، لغات خودشو داره و به طبع جدول خودشو - حالا کاربر خواست گروه رو حذف کنه - چه بلایی سر لغات بیاد؟ بله منتقل میشه به یه گروه دیگه و یا حذف میشه لغات ( بسته به نظر کاربر )

نیاز نیست هر گروه یک جدول مجزا داشته باشد. این چیزی که گفتید یک رابطه چند به چند هست. در موردش جستجو کنید.

md3848
چهارشنبه 06 شهریور 1398, 09:04 صبح
نیاز نیست هر گروه یک جدول مجزا داشته باشد. این چیزی که گفتید یک رابطه چند به چند هست. در موردش جستجو کنید.
باشه - با یه جدول انجام میدم - ولی یهو دیدی کل لغات ( رکورد های جدول ) شد 10k - حالا خوندن نوشتن ویرایش حذف و ... یکم زمانبر نمیشه؟
این "رابطه چند به چند" هم که داستانی داره برا خودش!، مزیت استفاده ازش چیه؟

الان این جدول منه :
CREATE TABLE [dbo].[Words] (
[id] INT IDENTITY (1, 1) NOT NULL,
[word] NVARCHAR (MAX) NOT NULL,
[mean] NVARCHAR (MAX) NOT NULL,
[imageURL] NVARCHAR (MAX) NULL,
[homeLVL] INT DEFAULT ((1)) NOT NULL,
[dateRead] DATE NOT NULL,
[categoryName] NVARCHAR (MAX) NOT NULL,
PRIMARY KEY CLUSTERED ([id] ASC)
);

id : که مشخصه چیه.
word و meam : لغت و معنی هستش.
imageURL : فعلا مهم نی ولی خب کاربر میتونه برا هر لغتی یه عکس انتخاب کنه - تا مثلا به جای word، عکسش نمایش داده بشه و بعد mean شو حدس بزنه ببینه بلده یا نه - یه چی تو این مایه ها.
homeLVL : هر لغت داخل یه خونه قرار داره ( میدونی که لایتنر 5-6 تا خونه داره - لغات خونه اول هر روز، خونه دوم 2روز یبار، خونه3، 4 روزیبار، خونه4، 8 روزیبار و ... )
dateRead : تاریخی که لغت آماده خوندن میشه.
categoryName : اینم دسته بندی لغات هستش ( طبق گفته شما، تمام جداول رو یکی کردم، فلذا این ستون هم به جدولم اضافه کردم؛ مثلا لغات الکترونیکی، لغات عمومی، لغات تخصصی و .... طرف در شروع برنامه تعیین میکنه که میخواد کدوم دسته از لغات رو مطالعه کنه )

الان این چیزی که گفتم رابطه چند به چند ( Many To Many ) نیاز داره؟

md3848
چهارشنبه 06 شهریور 1398, 10:19 صبح
فرقی ندارن
اگر برای جدول مقصد IDENTITY تعیین کنید و در هنگام ارسال ID رو نفرستید با ارور پست 1 مواجهه نمیشید ولی داده تکراری ذخیره میشه
یک راهی که به نظرم با ارسال ID میرسه این هست که قبلش محتویات جدول رو DELETE یا TRUNCATE کنید
یا اینکه از LIMIT - TOP - WHERE استفاده کنید
یه مشکل : الان از IDENTITY استفاده میکنم، id خودکار خودش افزایش پیدا میکنه در صورت insert record، ولی اگه یه رکوردی رو حذف کنم، id کاهش پیدا نمیکنه که

الان رکوردهای id من اینه :
1
2
3
مثلا مقادیر 2=id رو حذف میکنم که میشه این ( مقدار بقیه id ها اصلاح نمیشه - خیلی ناجور میشه اینطوری ) :
1
3
من توقع داشتم اینطوری بشه :
1
2

Mahmoud.Afrad
دوشنبه 11 شهریور 1398, 09:44 صبح
.......
categoryName : اینم دسته بندی لغات هستش ( طبق گفته شما، تمام جداول رو یکی کردم، فلذا این ستون هم به جدولم اضافه کردم؛ مثلا لغات الکترونیکی، لغات عمومی، لغات تخصصی و .... طرف در شروع برنامه تعیین میکنه که میخواد کدوم دسته از لغات رو مطالعه کنه )

الان این چیزی که گفتم رابطه چند به چند ( Many To Many ) نیاز داره؟

اگر یک لغت در چند گروه باشه اونوقت به مشکل میخورید.

یک جدول برای category نیاز دارید که مثلا گروه الکترونیکی، عمومی، تخصصی و ... را در اون تعریف می کنید که حداقل شامل نام گروه و یک کلیداصلی میشه.
رابطه بین جدول لغات و جدول category یک رابطه چند به چند هست که برای تعریف این رابطه به یک جدول واسط نیاز دارید که باید حداقل شامل کلیدلغت و کلیدگروه باشه تا مشحص بشه هر گروه شامل چه لغاتیست و هر لغت در چند گروه هست.


یه مشکل : الان از IDENTITY استفاده میکنم، id خودکار خودش افزایش پیدا میکنه در صورت insert record، ولی اگه یه رکوردی رو حذف کنم، id کاهش پیدا نمیکنه که

الان رکوردهای id من اینه :
1
2
3
مثلا مقادیر 2=id رو حذف میکنم که میشه این ( مقدار بقیه id ها اصلاح نمیشه - خیلی ناجور میشه اینطوری ) :
1
3
من توقع داشتم اینطوری بشه :
1
2

داده درون جدول که نباید خودکار تغییر کند!
شما فرض کن کلیداصلی تغییرناپذیر هست(یا اصلا به ترتیب نیست)
حالا مشکلی اگر دارید دنبال راه حلش باشید.

mr.sirwan
دوشنبه 11 شهریور 1398, 12:07 عصر
یه مشکل : الان از IDENTITY استفاده میکنم، id خودکار خودش افزایش پیدا میکنه در صورت insert record، ولی اگه یه رکوردی رو حذف کنم، id کاهش پیدا نمیکنه که

الان رکوردهای id من اینه :
1
2
3
مثلا مقادیر 2=id رو حذف میکنم که میشه این ( مقدار بقیه id ها اصلاح نمیشه - خیلی ناجور میشه اینطوری ) :
1
3
من توقع داشتم اینطوری بشه :
1
2

وقتی یه نفر فوت میکنه کلا شناسنامه و کدملیش باطل میشه، قرار نیست کد ملی یه شخص فوت شده رو به یه نفر دیگه نسبت بدن