2012-01-23 4 views
1

У меня вопрос. У меня есть таблица пользователей с двумя идентификаторами полей, которые уже являются первичным ключом и автоматическим приращением, однако у меня есть другое поле, которое называется user_id, которое является отдельным, что мне нужно будет автоматически увеличивать но первая вставленная строка будет иметь значение 10000 в db и приращение после этого.Возрастающий идентификатор пользователя

Вот моя функция до сих пор для создания пользователя в базе данных. Как я могу использовать как можно меньше кода, если он вставляет первую строку как 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

Это проще всего сделать непосредственно с базой данных, а не через вашу инфраструктуру. Кроме того, вы можете иметь только один столбец автоматического увеличения для каждой таблицы. –

+0

Согласовано w/@ BrianDriscoll. Вы можете добиться этого в MySQL, например, создав «user_id» автоинкрементный ключ (Google it). Имейте в виду, что PHP ограничен одним потоком, поэтому, если вы можете, скажем, иметь глобальный инкремент '$ user_id', он будет длиться только для текущего потока выполнения, а затем сбросить его при следующем запуске скрипта. – buley

ответ

1

Вы всегда можете просто создать свою собственную таблицу для хранения дополнительного количества вы хотите автоматическое приращение, в том же имении MySql делает это. Единственное отличие заключается в том, что mySQL имеет встроенную функцию для поддержки ее для каждой таблицы для столбцов iNT. Но встроенная опция предназначена только для одной строки и одной строки.

ли, как это делает, по сути, создав таблицу ID = TinyInt (4), user_id = INT (11)

Вставить новую строку, ID = 1, user_id = 10000

перед вставкой в ваш другой запрос таблицы для этой новой таблицы получите к нему 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. Таким образом, 10000 является MAX.

+0

Если я правильно прочитал, 10000 - это абсолютный минимум, а не максимум. – buley

+0

@editor - после того, как вручную добавлено только 1 пользователь, тогда max будет 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. –

Смежные вопросы