2011-01-11 2 views
4

У меня есть таблица, в которой я добавил столбец с именем phone - таблица также имеет идентификатор, заданный как первичный ключ, который автоматически указывает. Как вставить случайное значение в столбец телефона, который не будет дублироваться. Следующий оператор UPDATE вставлял случайные значения, но не все из них были уникальными. Кроме того, я не продаюсь. Я тоже правильно применил поле phone, но столкнулся с проблемами при попытке установить его как команду int (11) с командой ALTER TABLE (в основном, она выполнялась правильно, но при добавлении строки с новый номер телефона, вставленное значение было переведено на другой номер).MySQL Alter table, добавьте столбец с уникальным случайным значением

 
UPDATE Ballot SET phone = FLOOR(50000000 * RAND()) + 1; 

Таблица спецификации-х

 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| phone  | varchar(11) | NO |  | NULL |    | 
| age  | tinyint(3) | NO |  | NULL |    | 
| test  | tinyint(4) | NO |  | 0  |    | 
| note  | varchar(100) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
+0

Разумом, если я спрашиваю, почему вы должны это сделать? –

+0

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

+0

Теперь, когда я думаю, что это - поле телефона не обязательно должно быть случайным - пока оно уникально, а не существующий 10-значный номер телефона. Так что-то вроде UPDATE Ballot SET phone = id; должен/будет работать. – Schoffelman

ответ

2

Попробуйте

UPDATE Ballot SET phone = FLOOR(50000000 * RAND()) * id; 
+0

Это все еще не удовлетворяло его требованию гарантированной уникальности ... 60 (случайное число) * 1 (id) == 30 (точно так же, как случайный) * 2 (id). – kander

+2

, то просто добавьте идентификатор * id. i.e 893433 * id – shankhan

+0

Я сделал что-то похожее на это, чтобы заполнить поле, я просто не знаю, было ли это лучшим/правильным решением. – Schoffelman

0

Вы пробовали, создавая телефон, а затем проверить, если это значение уже не в колонке?

+0

В идеале вы захотите решить эту проблему. Выполнение обновления, за которым следует проверка, означает, что вы будете зацикливаться, что является дорогостоящим вычислением. (не то, что мое решение не является циклом, и оно, по крайней мере, так дорого ...) – kander

0

Я бы занялся этим, создав (временную) таблицу, содержащую числа в нужном вам диапазоне, а затем прокручивал каждую запись в таблице, которую вы хотите снабдить случайными числами. Выберите случайный элемент из таблицы temp, обновите таблицу и удалите его из таблицы temp. Не красиво, не быстро .. но легко развивается и легко тестируется.

5
-- tbl_name: Table 
-- column_name: Column 
-- chars_str: String containing acceptable characters 
-- n: Length of the random string 
-- dummy_tbl: Not a parameter, leave as is! 
UPDATE tbl_name SET column_name = (
    SELECT GROUP_CONCAT(SUBSTRING(chars_str , 1+ FLOOR(RAND()*LENGTH(chars_str)) ,1) SEPARATOR '') 
    FROM (SELECT 1 /* UNION SELECT 2 ... UNION SELECT n */) AS dummy_tbl 
); 

-- Example 
UPDATE tickets SET code = (
    SELECT GROUP_CONCAT(SUBSTRING('[email protected]' , 1+ FLOOR(RAND()*LENGTH('[email protected]'))  ,1) SEPARATOR '') 
    FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) AS dummy_tbl 
); 

Random string in MySQL

+0

Идеальное решение :) – kovpack

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