2013-05-20 86 views
13

我在其中一個數據庫中有一個名爲'textile_events'的表。MySQL使用遞增變量更新字段

mysql> describe textile_events; 

+-------------+--------------+-----+---------+----------------+ 
| Field  | Type   | Key | Default | Extra   | 
+-------------+--------------+-----+---------+----------------+ 
| id   | int(11)  | PRI | NULL | auto_increment | 
| token  | varchar(20) |  | NULL |    | 
| reg_time | datetime  |  | NULL |    | 
| eid   | varchar(20) |  | NULL |    | 
| fname  | varchar(20) |  | NULL |    | 
| lname  | varchar(20) |  | NULL |    | 
| paid  | varchar(10) |  | NULL |    | 
| seq_no  | int(11)  |  | NULL |    | 
+-------------+--------------+-----+---------+----------------+ 
8 rows in set (0.00 sec) 

mysql> select count(*) from textile_events; 

+----------+ 
| count(*) | 
+----------+ 
|  9325 | 
+----------+ 
1 row in set (0.00 sec) 

mysql> select count(*) from textile_events where eid = 'headsup' ; 

+----------+ 
| count(*) | 
+----------+ 
|  2553 | 
+----------+ 
1 row in set (0.01 sec) 

'seq_no'字段昨天引入上表。

現在,我需要爲所有'headsup' 事件中的'seq_no'字段分配一個遞增數字,其中付費字段等於'已付款'。

在其他的方式,我期待這樣的事情,

$i = 250 
while(true): 
    $i++ 
    UPDATE textile_events SET 'seq_no' = $i 
     WHERE eid = 'headsup' AND paid = 'paid' 
endwhile; 

如何分配一個遞增的數字,以一個新引入的場只recods 是satify給定的條件?

什麼是可用選項以及什麼是最有效的方法來實現這一點?

回答

36

你在找這樣的嗎?

UPDATE textile_events e, 
     (SELECT @n := 249) m 
    SET e.seq_no = @n := @n + 1 
    WHERE e.eid = 'headsup' AND e.paid = 'paid' 

SQLFiddle

+0

謝謝!這是我正在尋找的完美答案。 – Upeksha

+0

@Upeksha你當然歡迎。很高興它幫助:) – peterm

+0

任何線索如何我可以調整這個預先計數器字符串?例如。而不是1,2,3,4 ... foo1,foo2,foo3,foo4 ... – kabadisha

3

可能是這將幫助你......

DELIMITER $$ 
    DROP PROCEDURE IF EXISTS manual_increment_count$$ 
    CREATE PROCEDURE manual_increment_count() 
    BEGIN 
    DECLARE count INT DEFAULT 0; 
    SELECT COUNT(*) INTO count FROM textile_events 
    WHILE count > 0 
     SET count = count + 1; 
     update textile_events 
      set seq_no = count where eid = 'headsup' AND paid = 'paid'; 
    END WHILE; 
    END$$ 
    DELIMITER ; 
5

簡單的查詢會,正好被設置爲你想要一些數字的變量。然後通過從該數字中增加1來更新所需的列。對於所有的行,它會更新每行id通過遞增1

SET @a = 50000835 ; 
    UPDATE `civicrm_contact` SET external_identifier = @a:[email protected]+1 
    WHERE external_identifier IS NULL; 

希望這有助於某人。 :)