Jak utworzyć tabelę używając silnika innoDB w MySQL ?

0

Próbuję stworzyć tabelę, ale wyskakuje mi błąd **#1005 - Nie można stworzyć tabeli baza.post (Kod błędu: 150 "Foreign key constraint is incorrectly formed") **. Co ciekawe, jak zmienię silnik InnoDB na myisam to tabela zostanie utworzona.

CREATE TABLE `post` (
  `post_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `comment` varchar(300) COLLATE utf8_polish_ci NOT NULL,
  `date_to_add` date NOT NULL,
  `time_to_add` time NOT NULL,
  FOREIGN KEY user(`user_id`) REFERENCES user(`user_id`) ON DELETE CASCADE
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci ;

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `login` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  `password` tinytext COLLATE utf8_polish_ci NOT NULL
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


1

Jakiego typu jest user.user_id?

2

wywal user z pierwszego user(user_id) w FOREIGN KEY - jako pierwszy parametr podajesz nazwę pola w aktualnej tabeli a jako drugi referencję do pola w obcej tabeli

0

@abrakadaber:

O coś takiego Ci chodziło ? Teraz pokazuje błąd Oczekiwano przecinka lub nawiasu zamykającego. (near "ON DELETE" at position 253)

CREATE TABLE `post` (
  `post_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `comment` varchar(300) COLLATE utf8_polish_ci NOT NULL,
  `date_to_add` date NOT NULL,
  `time_to_add` time NOT NULL,
  FOREIGN KEY `user_id` REFERENCES user(`user_id`) ON DELETE CASCADE
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci ;
2
CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `login` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  `password` tinytext COLLATE utf8_polish_ci NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

CREATE TABLE `post` (
  `post_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `comment` varchar(300) COLLATE utf8_polish_ci NOT NULL,
  `date_to_add` date NOT NULL,
  `time_to_add` time NOT NULL
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci ;

ALTER TABLE `post` ADD FOREIGN KEY(`user_id`) REFERENCES `user`(`user_id`) ON DELETE CASCADE;

Pole w tabeli do które prowadzi referencja musi być kluczem głównym (albo przynajmniej musi być na nim index unikalny ale nie jestem na 100% pewny). Natomiast nie wiem dlaczego nie przechodzi definicja FK w DDL tabeli natomiast jako osobne polecenie działa. Jeszcze jedno - tabel user musi istnieć przed próbą dodania FK

0

@abrakadaber: Nie wiem co jest, ale twój powyższy kod też nie działa. Pojawia się ten sam błąd #1005 - Nie można stworzyć tabeli messbox.post (Kod błędu: 150 "Foreign key constraint is incorrectly formed") . Gdy zmienię silnik InnoDB na MyISAM to wtedy wszystko działa. Może to coś z konfiguracją bazy danych ?

1

to podaj cały kod taki jaki próbujesz wykonać

0

@abrakadaber: To znajduje się w pliku .sql który importuję do bazy w phpmyadmin. Tamto w ogóle nie przechodziło, zmieniłem na coś takiego, nie wiem czy to jest poprawnie zrobione, ale działa. Tylko pojawił się problem z tabelą 'post_like'. Tutaj nie chce utworzyć tej tabeli i wywala komunikat #1005 - Nie można stworzyć tabeli messbox.post (Kod błędu: 150 "Foreign key constraint is incorrectly formed"

CREATE TABLE `user` (
  `user_id`  int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(20)  NOT NULL,
  `password` tinytext NOT NULL,
PRIMARY KEY (user_id)
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

CREATE TABLE `post` (
  `post_id`  int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `comment` varchar(300) NOT NULL,
  `date_to_add` date NOT NULL,
  `time_to_add` time NOT NULL, 
  INDEX idx_user_id (user_id),
  FOREIGN KEY(`user_id`) REFERENCES  user(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE= InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci ;

CREATE TABLE `post_like` (
  `post_like_id` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  INDEX idx_post_id (post_id),
  INDEX idx_user_id (user_id),
  FOREIGN KEY(`post_id`) REFERENCES  post(`post_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY(`user_id`) REFERENCES  user(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

1

W tabeli post.post_id nie jest PRIMARY KEY
EDIT: dodatkowo dodałby unikalny INDEX na post_like(post_id, user_id)

1 użytkowników online, w tym zalogowanych: 0, gości: 1