2012-01-23 27 views
1

私は質問があります私は2つのフィールドidを持つユーザーのテーブルを持っています。これはすでにプライマリキーと自動インクリメントですが、別のフィールドはuser_idと呼ばれ、自動インクリメントが必要です挿入された最初の行は10000という値をデータベースに持ち、それ以降は増加します。ユーザーIDを増やす

ここでは、データベースにユーザーを作成するための私の関数です。できるだけ少ないコードで、最初の行を10000として挿入し、その後に1を追加するにはどうすればよいでしょうか。

/** 
* Create new user record 
* 
* @param array 
* @param bool 
* @return array 
*/ 
function create_user($data) 
{ 
    $data['created'] = date('Y-m-d H:i:s'); 

    $this->db->set('username', $data['username']); 
    $this->db->set('password', $data['password']); 
    $this->db->set('password2', $data['password2']); 
    $this->db->set('email', $data['email']); 
    $this->db->set('first_name', $data['first_name']); 
    $this->db->set('last_name', $data['last_name']); 


    $query = $this->db->insert('users'); 

    if ($query) 
    { 
     $user_id = $this->db->insert_id(); 
     if ($activated) $this->create_profile($user_id); 
     return array('user_id' => $user_id); 
    } 
    return NULL; 
} 
+0

これは、フレームワークではなくデータベースで直接行うのが最も簡単です。また、テーブルごとに1つの自動インクリメント列を持つこともできます。 –

+0

BrianDriscollと合意。たとえば、 'user_id'を自動インクリメントキー(Google it)にすることで、これをMySQLで実現できます。 PHPは単一のスレッドに限定されているので、グローバルな '$ user_id'インクリメンタを持つことができますが、現行の実行スレッドにしか残らず、次にスクリプトを実行するときにリセットすることができます。 – buley

答えて

1

あなたはいつもちょうどMySQLはそれをしないと同じマナーでは、自動インクリメントにしたい余分な番号を保存するための独自の表を作成することができます。違いはmySQLには、iNTカラムのテーブル単位でサポートする組み込み関数があります。しかし、組み込みオプションは1行と1行だけです。

それはテーブルのID = TINYINTを作成することによって、本質的には同じように実行します(4)、USER_ID = INT(11)

あなたが挿入する前に、新しい行、ID = 1、= 10000

のuser_idを挿入この新しいテーブルの他のテーブルクエリにuser_id +1を取得し、それを更新します。そして、その新しい番号を使って他のテーブルに挿入します。

私はこれに余分な2つのクエリのためのオーバーヘッドの概念があることを実現しますが、それは必要な目的に役立ちます。実際にJOINクエリを構築する場合は、ほとんどの場合、単一のクエリでこれを行うことができます。

1

このお試しください:

... 
$this->db->set('username', $data['username']); 
$this->db->set('user_id', 'MAX(user_id)+1'); 
$this->db->set('password', $data['password']); 
... 

をそしてUSER_IDはそのように、10000がMAXで10000です。最初のユーザーを作成します。

+0

この権利を読んだ場合、10000は絶対最小値であり、最大値ではありません。 – buley

+0

@editor - 手動で1人のユーザーを追加した後、最大値は10000になるので、次にこのメソッドを追加すると、user_idは10001になります。 – swatkins

+0

@ DampeS8N - 正しいですが、同じテーブルに複数のauto-incフィールドがありますか? – swatkins

2

これにはINSERT INTO ... SELECT文を使用できます。データベースライブラリにどのように適用するかは分かりません。しかし、その平凡なSQL。私のMySQLコンソールログを見てください。

mysql> CREATE TABLE `users`(
    id INT AUTO_INCREMENT, 
    `name` VARCHAR(10), 
    `user_id` INT, 
    PRIMARY KEY(`name`), 
    UNIQUE KEY (`id`) 
); 
Query OK, 0 rows affected (0.05 sec) 

mysql> INSERT INTO users VALUES (null, 'name1', 10000); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO users SELECT null, 'name2', MAX(`user_id`)+1 FROM `users`; 
Query OK, 1 row affected (0.00 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO users SELECT null, 'name2', MAX(`user_id`)+1 FROM `users`; 
Query OK, 1 row affected (0.00 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM `users`; 
+----+-------+---------+ 
| id | name | user_id | 
+----+-------+---------+ 
| 1 | name1 | 10000 | 
| 2 | name2 | 10001 | 
| 3 | name3 | 10002 | 
+----+-------+---------+ 
3 rows in set (0.00 sec) 
+0

それは最初の行かどうかを知っているかどうか、PHPを介して。 –

関連する問題