Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не заполняется столбец первичного ключа
 
 автор: antf   (30.08.2006 в 20:25)   письмо автору
 
 

Здравствуйте. При выполнении запроса:

INSERT INTO pages SET
                id_page = NULL,
                text = '',
                title = '1',
                id_cat = 7,
                descr = '1',
                keywords = '1',
                last_upd = NOW(),
                add_comments = 'no',
                id_lng = 1


Выдается ошибка

Column 'id_page' cannot be null

В чем может быть проблема.
Заранее спасибо за ответ.

   
 
 автор: Trianon   (30.08.2006 в 20:34)   письмо автору
 
   для: antf   (30.08.2006 в 20:25)
 

первый раз вижу такой синтаксис.
обычно если INSERT, то VALUES
если SET, то UPDATE

   
 
 автор: antf   (30.08.2006 в 20:51)   письмо автору
 
   для: Trianon   (30.08.2006 в 20:34)
 

Уже давно оценил выгоды такой записи:

1.Необязательно помнить порядок расположения столбцов в таблице. В такой записи столбцы не обязаны следовать друг за другом

2. Я сразу вижу что и куда у меня идет... Не надо угадывать по именам переменных или еще хуже вспоминать порядок следования столбцов, чтобы понять какое значение куда присваивается. Особенно, если запрос составлен был давно.

3. Удобно формировать запросы при помощи php:
<?
$part 
"descr = 'descr', ";
$query "INSERT INTO table SET 
                         id_page = NULL, 
                         title = 'title',"
;
$query .= $part;
$query  .= "text = 'text'"
?>

4. Удобно переделать запрос на UPDATE

   
 
 автор: Trianon   (30.08.2006 в 21:03)   письмо автору
 
   для: antf   (30.08.2006 в 20:51)
 

А совместимость со стандартами Вас не волнует?
Тогда извините, что вмешался.

   
 
 автор: antf   (30.08.2006 в 22:04)   письмо автору
 
   для: Trianon   (30.08.2006 в 21:03)
 

Форма записи запроса не влияет... Глючит и другая форма: проверено.

   
 
 автор: antf   (30.08.2006 в 22:58)   письмо автору
 
   для: Trianon   (30.08.2006 в 21:03)
 

Я просто, пользуясь случаем, делюсь своими нааблюдениями...

   
 
 автор: cheops   (31.08.2006 в 12:34)   письмо автору
 
   для: Trianon   (30.08.2006 в 21:03)
 

>А совместимость со стандартами Вас не волнует?
Разумеется она не волнует ни одного человека, который использует функцию mysql_query(), так как если речь идёт о совместимости со стандартном SQL, то необходимо пользоваться универсальным интерфейсом. Каждая программа оптимизируется по одному или нескольким параметрам: читабельность, краткость, скорость, переносимость, защита и т.д. и т.п. сосредоточиться сразу на всех параметрах невозможно. Если скрипт ориентируется на работу с базой данных MySQL, причём работать будет отсилы 1-2 года, зачем тратить усилия на гипотетическую совместимость со стандартом SQL, тем более добиться её всё равно не реально пока на MySQL.

   
 
 автор: Trianon   (31.08.2006 в 12:54)   письмо автору
 
   для: cheops   (31.08.2006 в 12:34)
 

Есть некие правила, в рамках которых программа должна находиться, чтобы оставаться читабельной. Говоря о стандартах, я имел в виду именно это. Возможно я неудачно выразился.

Вы же не предлагаете такой диалект ни в учебниках, ни в собственных примерах?
Хотя он и впрямь аккуратнее выглядит? Почему?

   
 
 автор: cheops   (31.08.2006 в 13:45)   письмо автору
 
   для: Trianon   (31.08.2006 в 12:54)
 

Мы об нём упоминаем, однако в стандарт он не попал не просто так, он действительно немного не удобен... стандарный вариант естественно расширяется до многострокового значения, вариант с SET - нет. При помощи стандартного варианта можно также не заполнять поля - поэтому дублирование синтаксиса тут выглядит как неортогональность диалекта. Тут я больше с вами соглашусь, я лишь хотел подчеркнуть, что в SQL стандарт очень здорово от реальности отстаёт - на несколько лет и придерживаться его практически не реально, особенно в MySQL, которая долгое время имела крайне своеобразный SQL.

PS Мне собственно ваш обвинительный тон не понравился :))), ну использует разработчик не стандартную фичу конкретной СУБД - что в этом плохого, хранимые процедуры в MS SQL тоже были долгое время не стандартной фичей...

   
 
 автор: antf   (31.08.2006 в 12:54)   письмо автору
 
   для: cheops   (31.08.2006 в 12:34)
 

Используется:

MySQL client version: 4.0.24

Таблица pages определяется так:

CREATE TABLE pages (
  `id_page` INT(32) NOT NULL AUTO_INCREMENT,
  `text`  MEDIUMTEXT,
  `title` TINYTEXT,
  `id_cat` INT,
  `descr`  MEDIUMTEXT,
  `keywords`  MEDIUMTEXT,
  `last_upd` TIMESTAMP,
  `add_comments` ENUM('yes', 'no'),
  `id_lng` INT,
  PRIMARY KEY(`id_page`)
);


Нет здесь ничего крамольного?

   
 
 автор: Trianon   (31.08.2006 в 13:01)   письмо автору
 
   для: antf   (31.08.2006 в 12:54)
 

А так:

INSERT INTO pages SET 
                id_page = 'NULL', 
                text = '', 
                title = '1', 
                id_cat = 7, 
                descr = '1', 
                keywords = '1', 
                last_upd = NOW(), 
                add_comments = 'no', 
                id_lng = 1 

тоже не проходит?

   
 
 автор: Trianon   (31.08.2006 в 13:02)   письмо автору
 
   для: antf   (31.08.2006 в 12:54)
 

`id_page` INT(32)
что-то мне подсказывает, что такие огромные числа MySQL хранить просто не умеет.
Хотя... надо глянуть в мануал.

---
Собственно 32 ничем не хуже и не лучше 255. Это всего лишь ширина поля. Величины же будут где-то в районе 10 знаков.

   
 
 автор: cheops   (31.08.2006 в 13:48)   письмо автору
 
   для: Trianon   (31.08.2006 в 13:02)
 

Это число номинально, на количество памяти только тип INT влияет, у столбца id_page никогда не будет больше 11 позиций, хотя можно написать вместо 32 хоть 100 - это поле используется лишь при форматном выводе.

   
 
 автор: Trianon   (31.08.2006 в 13:57)   письмо автору
 
   для: cheops   (31.08.2006 в 13:48)
 

При консольном выводе?
Я-то это понимаю.
Только в php характеристики ширины столбца таблицы читают в одном случае из тысячи. Да и тот - phpMyAdmin.
Просто когда такое число как 32 попадается в скобках после INT, это почти наверняка значит, что написавший его хотел выразить совсем другую вещь.

   
 
 автор: cheops   (31.08.2006 в 13:46)   письмо автору
 
   для: antf   (31.08.2006 в 12:54)
 

Вообще уберите
  id_page = NULL,

   
 
 автор: Loki   (31.08.2006 в 12:57)   письмо автору
 
   для: antf   (30.08.2006 в 20:25)
 

id_page у вас точно автоинкрементное?

   
 
 автор: antf   (31.08.2006 в 13:03)   письмо автору
 
   для: Loki   (31.08.2006 в 12:57)
 

Да, как видите :)

   
 
 автор: antf   (04.09.2006 в 07:03)   письмо автору
 
   для: antf   (31.08.2006 в 13:03)
 

Оказалось, что при установке дампа столбцам первичного ключа не было присвоен атрибут auto_increment. Вот отрывок из дампа: что тут криминального ? :)


CREATE TABLE `pages` (
  `id_page` int(32) NOT NULL,
  `text` mediumtext,
  `title` tinytext,
  `id_cat` int(11) default NULL,
  `descr` mediumtext,
  `keywords` mediumtext,
  `last_upd` timestamp NOT NULL,
  `add_comments` enum('yes','no') default NULL,
  `id_lng` int(11) default NULL,
  PRIMARY KEY  (`id_page`)
) TYPE=MyISAM AUTO_INCREMENT=39 ;

   
 
 автор: Trianon   (04.09.2006 в 10:43)   письмо автору
 
   для: antf   (04.09.2006 в 07:03)
 

Только то, что Вы и написали. У поля Не стоял признак автоинкремента:

CREATE TABLE `pages` ( 
  `id_page` int(32) NOT NULL auto_increment
  `text` mediumtext, 

   
 
 автор: antf   (04.09.2006 в 15:04)   письмо автору
 
   для: Trianon   (04.09.2006 в 10:43)
 

Он стоит, но стоит своеобразно. Я бы тоже написал также, как и вы, но phpmyadmin при создании дампа разместил это здесь:


add_comments` enum('yes','no') default NULL,
  `id_lng` int(11) default NULL,
  PRIMARY KEY  (`id_page`)
) TYPE=MyISAM AUTO_INCREMENT=39 ; 

   
 
 автор: Trianon   (04.09.2006 в 15:24)   письмо автору
 
   для: antf   (04.09.2006 в 15:04)
 

Значит дамп был создан некорректно. Или в исходной таблице поле потеряло это свойство.

это разные вещи.
Одно дело - текущее значение инкремента.
Другое - описание поля.
Если поле не описано, как сервер узнает, что именно оно является наращиваемым?

   
 
 автор: antf   (05.09.2006 в 21:48)   письмо автору
 
   для: Trianon   (04.09.2006 в 15:24)
 

Я уже когда-то поднимал тему о несовместимости дампов. Можно ли как-то управлять созданием дампа, ислючая несовместимые конструкции? Особенно некоторые версии mysql не любят указание кодировки при создании таблицы.
Правильно ли мое наблюдение: на локалке, если нет особой надобности, лучше установить версию mysql ниже, чем на хостинге. Тогда дампы будут 100% совместимы?

   
 
 автор: cheops   (05.09.2006 в 21:55)   письмо автору
 
   для: antf   (05.09.2006 в 21:48)
 

Можно, при помощи утилиты mysqldump можно не только создавать дампы для страых версий MySQL, но и для других СУБД. Для этого используется параметр --compatible, который может принимать значения ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb и т.д.

PS Только использовать mysqldump на хостинге не всегда возможно.

   
 
 автор: antf   (05.09.2006 в 22:02)   письмо автору
 
   для: cheops   (05.09.2006 в 21:55)
 

Главное на localhost можно. Некоторые пользователи Proteus присылают мне такие дампы. Мне приходится править их вручную...

   
 
 автор: antf   (05.09.2006 в 22:17)   письмо автору
 
   для: cheops   (05.09.2006 в 21:55)
 

Не работает. Что-то не так?

C:\server\usr\mysql\bin>mysqldump -u root --compatible ansi proteus > proteus.sql

   
 
 автор: cheops   (05.09.2006 в 22:26)   письмо автору
 
   для: antf   (05.09.2006 в 22:17)
 

Нужно так:
C:\server\usr\mysql\bin>mysqldump -u root --compatible=ansi proteus > proteus.sql

   
 
 автор: antf   (05.09.2006 в 22:37)   письмо автору
 
   для: cheops   (05.09.2006 в 22:26)
 

Понятно. Только какие бы параметры, предложенные вами я не подставлял всегда пишет:
unknown variable 'compatible=mssql'

   
 
 автор: cheops   (05.09.2006 в 22:43)   письмо автору
 
   для: antf   (05.09.2006 в 22:37)
 

В смысле, не очень понятно, что имеется ввиду?

   
 
 автор: antf   (05.09.2006 в 22:45)   письмо автору
 
   для: cheops   (05.09.2006 в 22:43)
 

Поправил предыд. пост

   
 
 автор: cheops   (05.09.2006 в 22:51)   письмо автору
 
   для: antf   (05.09.2006 в 22:37)
 

/* Поглядывая в мануал */ Дело в том, что эта опция доступна только начиная с MySQL 4.1...

   
 
 автор: antf   (15.09.2006 в 21:04)   письмо автору
 
   для: cheops   (05.09.2006 в 22:51)
 

Установил mysql50 - получается. Вот только кириллица в дампе заменяется на знаки вопроса. Можно ли как-то поправить кодировку?

   
 
 автор: cheops   (15.09.2006 в 21:39)   письмо автору
 
   для: antf   (15.09.2006 в 21:04)
 

А вы кодировку настраивали? Пропишите в my.ini в секции [mysqldupm] строку
default-character-set=cp1251

А лучше сразу пропишите в секции [mysqld], тогда и mysqldump кодировку от туда подцеплять будет.

   
 
 автор: antf   (15.09.2006 в 21:58)   письмо автору
 
   для: cheops   (15.09.2006 в 21:39)
 

1) В секции mysqld кодировка прописана, но на результат это не влияет.
2) Если прописать кодировку в секцию [mysqldump] :

[mysqld]
port=3306
basedir="C:/server/usr/mysql"
datadir="C:/server/usr/mysql/Data"
default-character-set=cp1251

[mysqldump]
default-character-set=cp1251

Вылезет вот что:

mysqldump: Character set 'cp1251' is not a compiled character set and is not specified in the 'C:\mysql\\share\charsets\Index.xml' file

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования