2016-04-14 18 views
1

Sorunumu ve soruyu özetlemek için elimden gelenin en iyisini yapacağım.Tabloyu Değiştirmek Birincil Anahtar Kimliği Oluşturulma Sırası Oluşturulma Tarihi

Sorun:

Ben MySQL veritabanından Makalelerimi ihraç ancak orijinal Birincil Anahtar kimliği tutmadı. Onu başka bir veritabanına aktardım ve iç içe oldu. Sorun, Oluşturulma Tarihi sütununun, table_contents öğesinden birincil anahtar kimliğine göre sıralı olmamasıdır. Diğer bazı bilgiler. PK otomatik artımdır.

Table sorted by ID

Gördüğünüz gibi, oluşturulan tarih hiç kronolojik değildir: Aşağıdaki resim bakınız. Şimdi benim yarattığım tarihe göre tablo sıraladığınızda:

Table sorted by Created Date

kimliklerini sırayla da değildir.

Olası Çözüm:

el olabilir yeniden düzenleyebilir tablosundaki her bir öğe, ama bu uzun zaman alacaktı.

Benim Düşünme:

SQL'de bir acemi değilim, ama ben istediğimi yapmak yazabilir SQL sorgusunun ne tür? Ne düşündüğümü, table_contents'ın bir kopyasını oluşturmak, orijinali ve kopyayı bir araya getirmek ve daha sonra ID'leri oluşturulma tarihine göre değiştirmek zorunda kalacağımı düşünüyordum. Sorgunun nasıl dürüst yazılacağından emin değilim.

Sorum:

nasıl içerik oluşturulduktan tarih sütuna göre kronolojik sırayla artan olmaya birincil anahtar kimlikleri sütunu değiştirmek için bir sorgu yazarsınız?

Kapanış: Ben anlamış değilim ya bu mümkün değilse

söyle lütfen. Teşekkür ederim!

Düzenleme: bir sorgu yazmaya çalıştı şimdiye kadar Geribildirimlerinizden Yani: ne denedim ile

ALTER TABLE skwx_content; 
SELECT @row_num := @row_num + 1 as newid, skwx_content.id from skwx_content , (select @row_num := 0) x order by skwx_content.created asc 
ALTER TABLE skwx_content DROP PRIMARY KEY; 
ADD COLUMN newid INT(10) NOT NULL AUTO_INCREMENT FIRST ORDER BY skwx_content.created ASC, 
ADD PRIMARY KEY (newid); 
ALTER TABLE skwx_content CHANGE newid id INT(10); 

hata alıyorum: puu.sh/ohBAC/c3a8b12340.png

cevap

0

kullanın update ve user variable ile order by yapacak. Yukarıdaki SQLs idam sonra verilerinizi sorgulamak ve her durumda onu sıralayabilir gibi birincil anahtar başka sütun ile sırada olması gerekmez rağmen

set @max_id = (select max(id) from mytable); 
set @id = @max_id; 
update mytable set id = (@id := @id + 1) order by created; 
update mytable set id = id - @max_id; 

id 1.

+0

Merhaba, sorguyu doğru olarak çalıştırıyorum mu? Resimde görüldüğü gibi bir hata alıyorum. Ayrıca param ve kullanıcı tanımlı değişkenler hakkında bir referansı da bağlayabilir misiniz? http://prntscr.com/as02qi – Roys

+0

Merhaba, denedim ve bu kimliğin zaten yabancı anahtar için var olduğunu söyleyen bir hata verdi. "" PRIMARY "anahtar için" 3 'girişini kopyala ". Gönderiye bir düzenleme ekledim, lütfen kod sorgusuna bakın. – Roys

+0

Merhaba, Sorgu çalıştı ve kimlik oluşturulan tarihin kronolojik sırasına göre! Birincil anahtarı sıfırlamak için bir yol var mı, böylece bir önceki maksimum ID yerine 1 tanesinde başlıyor? – Roys

0

başlayacak sen istiyorum ama yine de bunu yapmak istiyorum oluşturduğunuz tarihe dayalı bir satır numarası sütun almak için bu sorguyu kullanabilirsiniz

select @row_num := @row_num + 1 as RowNumber, t.[PrimaryKeyColumn] from [tablename] t, (select @row_num := 0) x order by t.CreatedDate asc 

Bu sorguyu katılarak tabloda yeni oluşturulan sütuna RowNumber sütununda yer alan değerlerle ekleyebilirsiniz masanızda birincil anahtara göre ve sonra yapabilirsiniz Bu yeni sütun birincil anahtarını yapın ve eski birincil anahtar sütununu kaldırın.

+0

Merhaba, sorgunuzu denedim ve harika. Diğer bir sütun oluşturdu, ancak bu sütunu birincil anahtar olarak tabloya nasıl ekleyebilirim ve aynı zamanda birincil anahtar olan eski kimlik sütununu nasıl bırakırım? Denediğim bir sorgu ile bir düzenleme ekledim, ancak bir hata alıyorum sözdizimdeki sorunun ne olduğunu anlamıyorum. – Roys

İlgili konular