Внешний ключ

Absinthe

жожо
У меня есть 3 таблицы:

PHP:
CREATE TABLE `data`(
  id INT(11) NOT NULL AUTO_INCREMENT,
  map_id INT(11) DEFAULT NULL,
  name TEXT DEFAULT NULL,
  `text` TEXT DEFAULT NULL,
  panorama TEXT DEFAULT NULL,
  video TEXT DEFAULT NULL,
  top INT(11) DEFAULT NULL,
  `left` INT(11) DEFAULT NULL,
  user_id INT(11) DEFAULT NULL,
  PRIMARY KEY (id),
  INDEX FK_data_maps_id (map_id),
  CONSTRAINT FK_data_maps_id FOREIGN KEY (map_id)
  REFERENCES maps (id) ON DELETE CASCADE ON UPDATE RESTRICT
)
ENGINE = INNODB
AUTO_INCREMENT = 1
AVG_ROW_LENGTH = 16384
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE maps(
  id INT(11) NOT NULL AUTO_INCREMENT,
  name TEXT DEFAULT NULL,
  `date` TEXT DEFAULT NULL,
  image TEXT DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
AVG_ROW_LENGTH = 8192
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE users(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  nick VARCHAR(64) NOT NULL,
  `group` VARCHAR(32) DEFAULT NULL,
  theme VARCHAR(64) NOT NULL DEFAULT 'default',
  `hash` VARCHAR(32) DEFAULT NULL,
  email VARCHAR(128) NOT NULL,
  gender ENUM('', 'male', 'female', 'trans') NOT NULL,
  location TEXT DEFAULT NULL,
  bio TEXT DEFAULT NULL,
  web VARCHAR(128) DEFAULT NULL,
  avatar VARCHAR(64) DEFAULT NULL,
  email_validate VARCHAR(32) NOT NULL DEFAULT '',
  share_email TINYINT(1) DEFAULT NULL,
  email_news TINYINT(1) DEFAULT NULL,
  name VARCHAR(64) DEFAULT NULL,
  new_messages INT(11) NOT NULL DEFAULT 0,
  karma INT(11) NOT NULL DEFAULT 0,
  remind_code VARCHAR(32) DEFAULT NULL,
  points_free INT(11) NOT NULL DEFAULT 0,
  points_paid INT(11) NOT NULL DEFAULT 0,
  email_new_friends TINYINT(1) NOT NULL DEFAULT 0,
  email_new_karma TINYINT(1) NOT NULL DEFAULT 0,
  smf_id INT(11) DEFAULT NULL,
  identifier TEXT DEFAULT NULL,
  last_online DATETIME DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE INDEX id (id),
  UNIQUE INDEX nick (nick),
  INDEX nick_hash (nick, `hash`)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8
Правильно ли использовать RESTRICT на обновление данных для карт? Я не хочу, чтобы ничего не происходило, из доков не понял разницы с NO ACTION.

Как мне создать внешний индекс с maps.user_id на user.id?
Запрос
PHP:
ALTER TABLE `data`
        ADD CONSTRAINT FK_data_users_id FOREIGN KEY (user_id)
        REFERENCES users (id) ON DELETE SET NULL ON UPDATE NO ACTION;
Выдает ошибку:
Can't create table 'mydatabase.#sql-1214_6a' (errno: 150)
Такую же ошибку выдает dbForge при добавлении при помощи мастера.
Что делать? Хочу чтобы при удалении пользователя user_id устанавливался в NULL, а при редактировании пользователя ничего не происходило.
 

Absinthe

жожо
Помогите пожалуйста с этим: может у вас заработает?
Я грешу на свою версию MySQL, т.к. и запрос с виду правильный, и dbForge такую же ошибку получает.
 

Absinthe

жожо
Проблемы решил.
В первом вопросе NO ACTION = RESTRICT, мне первый вариант написания нравится больше.
Во втором вопросе оно не могло связать integer и unsigned integer. Сделал оба одинаковыми(знаковыми) и заработало.
В любом случае я недоволен данной ошибкой: слишком непонятное описание косяка.
 
Сверху