AUTO_INCREMENT Sütun Değiştir

7 Cevap php

Ben bugün biraz daha erken bu soruyu sordum ama ben ne kadar net olarak emin değilim.

Ben sipariş numaraları 1-56 dolu bir MySQL sütun var. Bu rakamlar benim PHP komut dosyası tarafından değil, AUTO_INCREMENT tarafından üretildi.

Ne yapmak istiyorum PHP komut dosyası düzgün numaralarını ayarlar sonra bu sütunu auto_incrementing olun. PHP komut dosyası bana jQuery UI eklentisi kullanarak öğelerin bir listesini yeniden düzenlemek için izin veren bir jQuery arayüzü ile el ele çalışır.

Ben de girdileri istiyorum hangi sırayla karar verdikten sonra, ben otomatik artış için ayarlanacak sütun için istiyorum ben yeni bir giriş eklemek için olsaydı, zaten sütunda varolan en yüksek numarasını tanır ve olur böyle mevcut olandan biri yüksek olduğu için kendi kimliği sayısını ayarlayın.

Herkes bu senaryoyu yaklaşım konusunda herhangi bir öneriniz var mı?

7 Cevap

Ben senin AUTO_INCREMENT zaten yerinde olan tablo oluşturma öneririm. Sen auto_inc sütun için bir değer belirtebilirsiniz ve mysql auto_inc sütun için bir NULL veya 0 değerini belirtmek için kullanabilirsiniz, ve hala sonraki insert edecek sihirli kendisine atanan $ yüksek + 1 alacaksınız.

Örnek:

mysql> create table foobar (i int auto_increment primary key);

mysql> insert into foobar values (10),(25);

mysql> insert into foobar values (null);

mysql> select * from foobar;

# returns 10,25,26

Hayır, dur. Bu AUTO_INCREMENT noktası değildir. Bunları id tarafından sipariş yapacak değilseniz sonra sadece sipariş için masanın ucuna bir sütun eklemek ve size verir ekledi esneklik tadını, onları AUTO_INCREMENT yapmazlar. Eğer tek bir sütuna bilgi iki farklı set paketi için çalışıyoruz ve gerçekten sadece nasıl ayak kendinizi çekim hakkında gitmek için söylüyorum bu dizideki tüm iyi niyetli insanların rağmen seni kıçından ısıracak gibi görünüyor.

Önce bir birincil anahtar olarak o sütunu işaretlemek gerekir.

TABLO PRIMARY KEY (incrementField) ADD MyTable ALTER;

then ALTER TABLE mytable MODIFY COLUMN incrementField INTEGER NOT NULL DEFAULT 0 AUTO_INCREMENT;

Sen MySQL auto_increment uygulamasına geçiş yapabilirsiniz, ancak bunu yapmak için 3 sorguları alacağım:

a) ALTER TABLE, söz konusu alana AUTO_INCREMENT eklemek

b) SELECT MAX(id) + 1 sen kimliğini ayarlamak için gerekenleri öğrenmek için

c) ALTER TABLE table AUTO_INCREMENT =result from (b)

MySQL AUTO_INCREMENT, değeri bir tabloda düzeyinde işlem değiştiren, böylece (a) bunu yapamaz, ve bu MAX(id) (c) yapmak için izin vermez düşünüyor , bu yüzden 3 sorgular.

MySQL bir auto_increment alanı için özel bir değer ayarlayabilirsiniz. MySQL sonra yeni satırlar için yüksek auto_increment sütun değeri kullanmak, aslında MAX(id)+1. Olacak Bu etkili, özel kullanım için kimlikleri aralığı rezerve anlamına gelir. Örneğin:

CREATE TABLE mytable (
 id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
 col1 VARCHAR(256)
); 
ALTER TABLE mytable AUTO_INCREMENT = 5001;

Bu şema tüm kimlikleri < 5001 sistem tarafından kullanılmak üzere ayrılmıştır. Yani, PHP komut değerlerini otomatik olarak oluşturabilirsiniz:

for ($i=1; $i<=56; $i++)
 mysql_query("INSERT INTO mytable SET id = $i, col1= 'whatevers'");

Yeni girişler id belirterek veya boş ayarlayarak değil tarafından olmayan ayrılmış aralığını kullanır:

INSERT INTO mytable SET id = NULL, col1 = 'whatevers2';
-- The id of the new row will be 5001

Böyle bir dizi rezervasyonu anahtardır - durumda ileride fazla 56 özel / sistem satır gerekir.

ALTER TABLE <table name> <column name> NOT NULL AUTO_INCREMENT

More info: AUTO_INCREMENT Handling in InnoDB

Server SQL Modes

Sen phpmyadmin kullanarak mysql konsol arabirimi veya (kolay) kullanarak, php aracılığıyla yayınlanan bir sorgu ile değiştirebilirsiniz.

ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition;
ALTER TABLE table_name AUTO_INCREMENT = highest_current_index + 1

column_definiton:

old_column_definition AUTO_INCREMENT 

Daha fazla bilgi:

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

EDIT Always use mysql_insert_id or the appropiate function of your abstraction layer to get the last created id, as LAST_INSERT_ID may lead to wrong results.