SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.07.2009 13:27:04

Simon-n70
Участник
Зарегистрирован: 04.07.2009
Сообщений: 4

ID не подставляется автоматически.

Есть таблица users  MyISAM поля такие:
id int primary key not null auto_increment unsigned default null
date timestamp(10) not null
name char(20) not null
last_name char(20) not null

Для вставки данных набираю:
insert into users values ('name', 'last_name');
т.е хочу чтобы id и date вставились автоматом, но получается ошибка.
А если набирать: insert into users values (null, null, 'name', 'last_name');
или insert into users (name, last_name) values ('name', 'last_name'); то всё работает как надо...

Так вот собственно вопрос: как сделать так, чтобы не набирать каждый раз NULL?

PS надеюсь объяснил правильно....

Неактивен

 

#2 04.07.2009 15:21:27

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: ID не подставляется автоматически.

Версия сервера, режим его работы? Описание поля id вызывает большие сомнения. Вы там ничего не напутали?

Отредактированно honomer (04.07.2009 15:25:16)

Неактивен

 

#3 04.07.2009 15:50:10

Simon-n70
Участник
Зарегистрирован: 04.07.2009
Сообщений: 4

Re: ID не подставляется автоматически.

Версия сервера написал:

mysql  Ver 14.14 Distrib 5.1.35, for redhat-linux-gnu (x86_64) using readline 5.1

Описание поля id вызывает большие сомнения. Вы там ничего не напутали? написал:

Да нет вроде...
Вот так, точно: ID tinyint(4) unsigned not null primary key auto_increment

Неактивен

 

#4 04.07.2009 16:16:22

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: ID не подставляется автоматически.

Нужно посмотреть режим работы сервера. Понять не могу как не вылезает ошибка при назначении null полю, которое не может этот null содержать в принципе. Сервак выдает какие-нибудь сообщения сообщения? Еще желательно увидеть текст сообщения об ошибки, которая вылезает в первом варианте оператора вставки. Мне кажется, что проблема в том, что полю date не назначено значение по дефолту. Не всегда можно воспользоваться автоназначением полю типа timestamp текущей даты.

Неактивен

 

#5 04.07.2009 16:33:08

Simon-n70
Участник
Зарегистрирован: 04.07.2009
Сообщений: 4

Re: ID не подставляется автоматически.

При первом варианте:
ERROR 1136 (21S01): Column count doesn't match value count at row 1
Для date по дефолту: CURRENT_TIMESTAMP
А что значит: режим работы сервера? И где (как) это узнать?

Отредактированно Simon-n70 (04.07.2009 16:34:10)

Неактивен

 

#6 04.07.2009 16:59:55

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: ID не подставляется автоматически.

1. Сообщение об ошибке переводится как "число столбцов не совпадает с числом значений в строке 1". Просто нужно перечислить те поля, которым ты назначаешь значения в предложении VALUES. В третьем варианте ты использовал верный синтаксис. Ошибка в первом варианте вылезла потому, что можно опускать список полей только в случаях, когда: значения указываются для всех полей таблицы и эти значения для полей перечислены в том порядке, в котором поля следовали при создании таблицы в операторе CREATE TABLE. Если ты создал поля со значениями по умолчанию и они идут подряд в начале или в конце списка полей в CREATE TABLE, то список полей в операторе INSERT также можно опустить. В остальных случаях вылезет ошибка, такая как у тебя. В твоем случае проблема как раз с полем date - для него ты не задал значения по дефолту.

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

3. Сервер MySQL может работать в несколких режимах. Режим работы сервера влияет на то какие ситуации сервер будет считать ошибками, и то как он будет на них реагировать. Я так понимаю, что ты не менял режим работы сервера, а оставил все по умолчанию (режим TRADITIONAL). Этот режим является составным и в нем используется режим STRICT_ALL_TABLES. Это означает, что для всех типов таблиц, включая и MyISAM, используются более строгие правила толкования операторов SQL. Нестандартное поведение приводит к появлению ошибок. Об этом я уже писал в пункте 2.

Тебе нужно изменить таблицу, используя ALTER TABLE. Изменять нужно описание поля date чтобы задать ему явно значение по умолчанию. Выглядеть описание поля date должно следующим образом:

date timestamp(10) NOT NULL DEFAULT CURRENT_TIMESTAMP


Проверить текущий режим работы сервера можно используя
SELECT @@SESSION.sql_mode;

Отредактированно honomer (04.07.2009 17:04:16)

Неактивен

 

#7 04.07.2009 23:05:03

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: ID не подставляется автоматически.

Э-э... Как бы это сказать.... Вобщем я тут попробовал сам поковыряться. Ты знаешь, даже с явным указанием значения по умолчанию не получится сделать то, что ты хочешь. Все равно придется либо писать null в предложении VALUES, либо перечислять поля, которым назначаешь значения. Похоже что то, что получается в других СУБД здесь не прокатывает. Однако, карма... smile

Неактивен

 

#8 05.07.2009 02:24:21

Simon-n70
Участник
Зарегистрирован: 04.07.2009
Сообщений: 4

Re: ID не подставляется автоматически.

Спасибо тебе огромное. Но тут, во всей фигне, есть один вариант, про который я не говорил.... Когда я первый раз использовал MySQL (было это на Windows XP SP3) всё было именно так как я хотел. Потом попробывал на Ubuntu ничего не изменилось... Теперь я использую Fedora 11. И вот такая фигня. (см. выше) Уже чуть голову не сломал, ничего не выходит. Даже без поля DATE! Просто с ID...
Как переводится на русский эта ошибка я знаю. Мне больше было интересно ПОЧЕМУ она возникает! Ведь раньше у меня такого не было.........
Ещё раз спасибо.

Неактивен

 

#9 05.07.2009 18:12:09

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: ID не подставляется автоматически.

Ну, что сказать?.. MySQL всегда был славен более слабой поддержкой стандартов нежели другие СУБД. Могу посоветовать только одно: не надейся на разные примочки а-ля мускул. Алилуйя!

Неактивен

 

#10 06.07.2009 11:34:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ID не подставляется автоматически.

Ух, какое обсуждение smile Отвечу, пожалуй, на изначальный вопрос.
Правильный синтаксис такой:

insert into users (name, last_name) values ('name', 'last_name');

или, соответственно,
insert into users set name = 'name', last_name = 'last_name';


P.S. honomer, MySQL достаточно хорошо справляется с поддержкой стандартов. А какая
СУБД позволит это сделать без указания колонок? Как она узнает, куда вставлять?

Неактивен

 

#11 06.07.2009 13:26:14

honomer
Участник
Зарегистрирован: 26.06.2009
Сообщений: 16

Re: ID не подставляется автоматически.

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

А какая СУБД позволит это сделать без указания колонок?

SQL Server 2005 спокойно распознает по крайней мере наличие автоинкрементного поля. Во всяком случае синтаксис

INSERT INTO users VALUES (CURRENT_TIMESTAMP, 'name', 'last_name');

там работает на ура. А вот с MySQL такой номер не прокатил. Я, конечно, напарил с разъяснениями, но указывать явно значение по дефолту все-таки стоит. Да и причину ошибки указал верно.
И потом, обратите внимание на последний пост автора. Как то странно это.

Отредактированно honomer (06.07.2009 13:30:37)

Неактивен

 

#12 06.07.2009 14:19:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ID не подставляется автоматически.

Подозрительно, не должно было работать ни в каких режимах smile

--

Надо попробовать в MSSQL, это прикольно, если они умеют вычленять автоинкременты smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson