2013-04-29 3 views
0

я проблема с моим приложением, записи не копируются из одной таблицы говорят TABLEA к другому столу сказать TableB с помощью PHP & MYSQL. Проблема возникает только в том случае, если первичный ключ 19 цифр длинный и начинающийся с цифры и отлично работает для всех других первичных ключей. Не сообщается об ошибке, процесс просто не копирует результаты.Вставить в выберите - не работает

Я использую следующий запрос, чтобы скопировать записи -

INSERT into tableB (select * from tableA where primary_key_id=id) 

Запросы работают отлично при выполнении вручную с помощью жаба/PHPMyAdmin.

Любые идеи или предложения по его решению были бы очень признательны.

+0

не вставка INSET –

+0

с 19 цифр я ожидаю, что он просто работает из его типа данных. Вы можете показать нам некоторые из окружающих PHP. – nvanesch

+0

Нам нужно иметь код som, чтобы дать вам больше отзывов. Как идентификатор, назначенный в вашем коде, например? Как выполняется фактический запрос? – bestprogrammerintheworld

ответ

0

У меня точно возникла проблема .. это целочисленное переполнение в php.

Когда PHP сталкивается с числом, которое становится слишком большим для хранения в течение длительного времени, оно будет помещено в поплавок. и когда он будет эхом, чтобы плавать, он будет использовать поплавковую нотацию.

И, по случайному совпадению, это 19-значное число, начинающееся с 9, где оно начинает идти не так.

$large_number = 9223372036854775807; 
var_dump($large_number);      // int(9223372036854775807) 

$large_number = 9223372036854775808; 
var_dump($large_number);      // float(9.2233720368548E+18) 

Таким образом, вы должны сохранить первичный ключ в виде строки или использовать форматирование чисел для его вывода.

Источник: http://php.net/manual/en/language.types.integer.php

+0

Спасибо за ваш ответ .. На моей странице PHP все первичные идентификаторы создаются/используются как строки. Однако более подробно мой запрос sql похож на этот $ p_id от переменной запроса, то есть $ p_id = $ _REQUEST ['p_id']; $ sql = "insert into tableB (выберите * from tableA где primary_key_id = '". $ P_id. "')"; Пожалуйста, предложите, интересно, нужно ли мне вставлять переменную $ p_id в строку? – KLH

+0

Я бы попытался vardump p_id. Посмотрите, что он показывает. Если он показывает формат float, который является проблемой, и вы должны сделать на нем формат. Если он показывает нормально (ваш код скажет, что это будет, тогда проблема в том, что он заканчивается из типа данных на стороне базы данных (см. Ответ mvp) – nvanesch

0

Try следующим образом:

INSERT INTO table1 (column1) 
SELECT col1 
FROM table2 
0

вы имеете в виду

INSERT 

и не

INSET 

здесь, как вы можете сделать это

insert into table_name (column1, column2) values (select column3, column4 from table2 where ...) 
1

Для работы INSERT ... SELECT вы должны либо предоставить список столбцов для INSERT, либо иметь SELECT вывод соответствия точно tableB.

Если значение tableB в точности совпадает с tableA, ваш запрос должен работать (с использованием INSERT, а не INSET). Вы также можете создать tableB сразу использовать это:

CREATE TABLE tableB AS SELECT * FROM tableA ... 

Если tableA и tableB действительно та же самая структура, одна из причин, почему ваш INSERT с 19-значные первичный ключ может не удастся, потому что вы, возможно, пытается для вставки дубликатов ключей от tableA в tableB: ваш INSERT копирует все, включая значение первичного ключа.

ОБНОВЛЕНИЕ: Согласно MySQL documentation, максимальное значение BIGINT является 9,223,372,036,854,775,807 - 19 цифр, максимальное значение начинается с 9. Это звучит подозрительно близко к описанию проблемы. Я считаю, что у вас просто не хватает максимально допустимого значения для BIGINT, и факт, что вы хотите, BIGINT(20) не поможет.

+0

Нет повторяющихся ключевых ошибок, да, это копирует все, включая первичный ключ. – KLH

+0

@KLH: ответ обновлен - думаю, у вас заканчивается BIGINT_MAX. – mvp

+0

Wow .. Это много записей ... – webnoob

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