Меню

Ошибка связь уже существует phpmyadmin

Здравствуйте. Создала таблицы: Страны, Страны-туры, Туры. Связала таблицы Страны и Страны-туры по Id,а вот связать Страны-туры и Туры уже не получилось. Связывала по одному и тому же принципу,но при создании второй связи выдает следующее:

PHP
1
2
3
4
5
6
7
8
9
10
11
SQL-запрос:
 
ALTER TABLE  `Тур-страна` ADD FOREIGN KEY (  `tour_id` ) REFERENCES  `admin`.`Тур` (
 
`Id`
) ON DELETE CASCADE ON UPDATE CASCADE ;
 
 
Ответ MySQL: Документация
 
#1050 - Table '.admin@y0@z0@w0@002d@s0@y1@x0@y0@u0' already exists

Подскажите,пожалуйста, неужели в одной таблице может быть только один атрибут связан? Связывала атрибуты так: в таблице Страны Id имеет тип Int и автоинкремент. В таблице Страны-туры атрибут Id_country,который ссылается на атрибут Id таблицы Страны , имеет по умолчанию NULL и является индексом, далее шла в «Связи», соединяла соответствующие атрибуты и было все ок. Проделала те же действия с таблицами «Туры-страны» и Туры, но выдало вышеизложенное сообщение. Буду благодарна за ответы.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Активные темы Темы без ответов

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

1 2011-05-07 08:34:48 (изменено: dobroe_utro, 2011-05-07 08:43:54)

  • dobroe_utro
  • Новичок
  • Неактивен
  • Зарегистрирован: 2011-05-07
  • Сообщений: 1

Тема: Не отображаются связи в designer базы данных.

Доброе всем утро.
Прошу Вас помочь мне-))))
Создала бд, и мне нужно соединить линиями таблички в designer

один раз  щелкнули на одном поле, потом на другом, с которым нужно соединить, появится окошечко
‘create relation&’ нажала ок. И линия не отображается…. Сорри.

2 Ответ от Hanut 2011-05-07 11:45:37

  • Hanut
  • Hanut
  • Модератор
  • Неактивен
  • Откуда: Рига, Латвия
  • Зарегистрирован: 2006-07-02
  • Сообщений: 9,722

Re: Не отображаются связи в designer базы данных.

dobroe_utro сказал:

один раз  щелкнули на одном поле, потом на другом, с которым нужно соединить

В панели инструментов нажимаем кнопку «Создать связь», после чего рядом с курсором появится надпись «Выберите ссылочный ключ», выбираемое поле ссылочного ключа должно иметь тип индекса (иконка ключика); после выбора ссылочного ключа, рядом с курсором появится надпись «Выберите внешний ключ», выбираем связываемое поле в другой таблице и линия должна появиться. Связь уже создана, но чтобы в поле внешнего ключа отображалась желаемая информация из связанной таблицы, необходимо в панели инструментов нажать кнопку «Выбор отображаемого столбца» и кликнуть по желаемому поля для отображения в первой таблице.

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

3 Ответ от Bernet 2011-05-17 11:36:06 (изменено: Bernet, 2011-05-17 11:54:58)

  • Bernet
  • Редкий гость
  • Неактивен
  • Зарегистрирован: 2011-05-17
  • Сообщений: 5

Re: Не отображаются связи в designer базы данных.

у меня та же беда( сделал всё как вы описали, но всё равно пишет Ошибка. Связь не создана
у вас тут написано http://forum.php-myadmin.ru/viewtopic.php?id=1447 что связи для таблиц MyISAM создать нельзя, то получается надо использовать только таблицы InnoDB? и связи надо задавать через дизайнер когда соединяешь таблицы графично, или всё таки через кнопку Связи->Внутренние связи? а то я не могу понять где их вообще создавать

4 Ответ от Hanut 2011-05-17 11:55:38

  • Hanut
  • Hanut
  • Модератор
  • Неактивен
  • Откуда: Рига, Латвия
  • Зарегистрирован: 2006-07-02
  • Сообщений: 9,722

Re: Не отображаются связи в designer базы данных.

Bernet сказал:

связи зависят от типа таблиц..?

Зависят в любом случае. Хотя даже не знаю что будет, если связать таблицы MyISAM и InnoDB — не пробовал.

5 Ответ от Hanut 2011-05-17 12:01:07

  • Hanut
  • Hanut
  • Модератор
  • Неактивен
  • Откуда: Рига, Латвия
  • Зарегистрирован: 2006-07-02
  • Сообщений: 9,722

Re: Не отображаются связи в designer базы данных.

Bernet сказал:

связи для таблиц MyISAM создать нельзя

Связи для таблиц MyISAM создаются с помощью специального механизма phpMyAdmin, в то время, как связи таблиц InnoDB хранятся в структуре самих таблиц. Связи можно делать для обоих типов этих таблиц.

Bernet сказал:

связи надо задавать через дизайнер когда соединяешь таблицы графично, или всё таки через кнопку Связи->Внутренние связи?

Я делаю связи только через Дизайнер. На странице связей можно более точно определить связь таблиц типа InnoDB, если это надо.

6 Ответ от Bernet 2011-05-17 12:15:57

  • Bernet
  • Редкий гость
  • Неактивен
  • Зарегистрирован: 2011-05-17
  • Сообщений: 5

Re: Не отображаются связи в designer базы данных.

просто я пробовал через дизайнер сначала выбирал поле с ID (первичный ключ) потом FK (вторичный ключ) но связь не создаётся пишет ‘ошибка. Связь не добавлена’, вот скрин моих табличек…
http://nextsoft-obmen.at.ua/_ph/1/677919075.png

7 Ответ от Hanut 2011-05-17 17:36:03

  • Hanut
  • Hanut
  • Модератор
  • Неактивен
  • Откуда: Рига, Латвия
  • Зарегистрирован: 2006-07-02
  • Сообщений: 9,722

Re: Не отображаются связи в designer базы данных.

Bernet сказал:

ID (первичный ключ) потом FK (вторичный ключ)

Вроде все правильно.

Покажите структуры связываемых таблиц, чтобы я попробовал. Если получится, значит проблема где-то у вас.

8 Ответ от Bernet 2011-05-17 21:15:33

  • Bernet
  • Редкий гость
  • Неактивен
  • Зарегистрирован: 2011-05-17
  • Сообщений: 5

Re: Не отображаются связи в designer базы данных.

9 Ответ от Hanut 2011-05-17 21:57:34

  • Hanut
  • Hanut
  • Модератор
  • Неактивен
  • Откуда: Рига, Латвия
  • Зарегистрирован: 2006-07-02
  • Сообщений: 9,722

Re: Не отображаются связи в designer базы данных.

Bernet сказал:

Вот скрины всех трёх табличек

Выберите в phpMyAdmin таблицы и перейдите на страницу экспорта, где сделайте экспорт структур таблиц без данных. Нужны SQL запросы, которые будут выведены. По картинкам я не смогу сделать. smile

10 Ответ от Bernet 2011-05-17 22:31:07

  • Bernet
  • Редкий гость
  • Неактивен
  • Зарегистрирован: 2011-05-17
  • Сообщений: 5

Re: Не отображаются связи в designer базы данных.

извините я просто только начал изучать это дело вот и туплю маленько wink
это оно?) Табличка1:

-- phpMyAdmin SQL Dump
-- version 2.11.4
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Май 17 2011 г., 22:25
-- Версия сервера: 5.0.51
-- Версия PHP: 5.2.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- База данных: `computer_shop`
--

-- --------------------------------------------------------

--
-- Структура таблицы `computer`
--

CREATE TABLE IF NOT EXISTS `computer` (
  `ID_Computer` int(10) unsigned NOT NULL auto_increment,
  `Processor` varchar(20) character set utf8 collate utf8_unicode_ci NOT NULL,
  `Chastota` double NOT NULL,
  `RAM` int(11) NOT NULL,
  `Model` varchar(20) character set utf8 collate utf8_unicode_ci NOT NULL,
  `Release_Date` date NOT NULL,
  PRIMARY KEY  (`ID_Computer`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Дамп данных таблицы `computer`
--

табличка 2:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- База данных: `computer_shop`
--

-- --------------------------------------------------------

--
-- Структура таблицы `firms`
--

CREATE TABLE IF NOT EXISTS `firms` (
  `ID_Firm` int(11) NOT NULL auto_increment,
  `Firm_name` varchar(30) default NULL,
  `Adres` varchar(50) default NULL,
  PRIMARY KEY  (`ID_Firm`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Дамп данных таблицы `firms`
--

и наконец третья:)

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- База данных: `computer_shop`
--

-- --------------------------------------------------------

--
-- Структура таблицы `market_supply`
--

CREATE TABLE IF NOT EXISTS `market_supply` (
  `ID_Supply` int(10) unsigned NOT NULL auto_increment,
  `Number_comp` int(10) unsigned NOT NULL,
  `Price` int(10) unsigned NOT NULL,
  `FK_Computer` int(10) unsigned NOT NULL,
  `FK_Firms` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`ID_Supply`),
  KEY `FK_Computer` (`FK_Computer`),
  KEY `FK_Firms` (`FK_Firms`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Дамп данных таблицы `market_supply`
--


--
-- Ограничения внешнего ключа сохраненных таблиц
--

--
-- Ограничения внешнего ключа таблицы `market_supply`
--
ALTER TABLE `market_supply`
  ADD CONSTRAINT `market_supply_ibfk_1` FOREIGN KEY (`FK_Computer`) REFERENCES `computer` (`ID_Computer`) ON UPDATE NO ACTION;

11 Ответ от Hanut 2011-05-18 11:41:58

  • Hanut
  • Hanut
  • Модератор
  • Неактивен
  • Откуда: Рига, Латвия
  • Зарегистрирован: 2006-07-02
  • Сообщений: 9,722

Re: Не отображаются связи в designer базы данных.

Судя по запросам, одна связь между computer.ID_Computer и market_supply.FK_Computer у вас есть и она должна отображаться в дизайнере.

Связать firms.ID_Firm и market_supply.FK_Firms у вас не получится, потому что поля имеют разный тип данных int(10) и int(11).

Если вы заходите в phpMyAdmin не под root, то обратите внимание на права пользователя, которые должны распространяться на БД phpmyadmin, где хранятся связи таблиц.

Пока не поздно, советую сделать следующее: смените тип таблиц на MyISAM; проставьте у всех таблиц единую кодировку (сейчас кодировки перемешаны); установите связи в Дизайнере.

12 Ответ от Bernet 2011-05-18 17:29:32

  • Bernet
  • Редкий гость
  • Неактивен
  • Зарегистрирован: 2011-05-17
  • Сообщений: 5

Re: Не отображаются связи в designer базы данных.

Вообщем снёс ту базу сделал заново, связи в дизайнере так и не получились, сделал просто через вкладку Связи, вроде всё нормально  спасибо Вам большое за помощь и потраченное время  smile

Сообщения 12

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

На хостинге есть 3 таблицы (InnoDB) со связями. У каждой есть свой первичный ключ. При добавлении ограничения везде выбирал ON DELETE CASCADE, ON UPDATE CASCADE. Всё отлично работает, но в дизайнере связи не отображаются и появляется данное окно (скрин). Даже перемещать таблицы нельзя.

Причём окно Удалить связь накладывается на Создать связь.

Версия phpMyAdmin: 4.4.15.10

Причём точно так же на локалке с последней версией phpMyAdmin.
В чём может быть проблема?введите сюда описание изображения

задан 11 мая 2018 в 7:46

Евгений's user avatar

1

скачай последнюю версию phpmyadmin и распакуй в папку, где лежит у тебя phpmyadmin (на локальном сервере помогло)

ответ дан 3 июл 2018 в 13:32

Сергей's user avatar

СергейСергей

93 бронзовых знака

Вопрос:

Когда я хочу создать связь между двумя таблицами в режиме конструктора с phpMyAdmin 4.3.8, это дает мне ошибку: Ошибка: реляционные функции отключены!
Когда я пробую это с 4.1.4, он работает отлично.
Кажется, я не могу найти, где я должен изменить настройки, чтобы создавать отношения в режиме конструктора.
Есть идеи?
Спасибо заранее!

Ответ №1

Преобразуйте свой движок table/db в InnoDB, используя

ALTER TABLE имя_таблицы ENGINE = InnoDB;

Ответ №2

У меня была такая же проблема, потому что у меня не было базы данных на сервере mysql для настроек pypMyAdmin.

Поэтому вам может потребоваться обновить базу данных настроек PMA или создать ее…

Существует руководство о том, как это сделать здесь

Ответ №3

Я столкнулся с той же ошибкой, что не создал никаких PMA-пользователей. Я только что обновил версию phpmyadmin до последней версии, и все работало просто отлично.

вот ссылка для скачивания, и для меня это было 4.6.0

https://www.phpmyadmin.net/downloads/

и для меня я работал над MAMP Pro, поэтому я просто сделал:

  • Я остановил сервер (MAMP Pro).
  • Я скопировал файл (config.inc.php) из старой папки phpmyadmin в новую.
  • Я заменил старую версию новой ( “/Applications/MAMP/bin/” ).
  • Я скопировал ту же самую новую папку с версией ( “/Library/Application Support/appsolute/MAMP PRO/” ), потому что я работаю с MAMP Pro, а не с MAMP.
  • И затем я перезапустил сервер (MAMP Pro), и все работало нормально.

Я надеюсь, что это сработает и для вас.

Ответ №4

Измените свою таблицу на InnoDB, используя:

ALTER TABLE имя вашей таблицы ENGINE = InnoDB

The table2 foreign key constraint means that any table2 customerId value must appear as a customerId in table1. You are getting the error because you are inserting a customerID into table2 that doesn’t appear in table1.

Since the DBMS is generating table1 customerIDs by auto increment, if you insert a row you have to get that value in order to insert a row using that customerID into table2.

I guess you say «I already established a relationship between table1 and table2» to mean «I declared a foreign key constraint». And I guess you think that means «after I insert into table1 the DBMS will use the auto-generated key value as the foreign key value when I insert into table2». But it doesn’t mean that. You have to do that yourself. The foreign key constraint just means that the DBMS checks that every table2 customerId value appears as a table1 customerId value.

You can and must use any previously inserted key value as the corresponding value when you insert into a table with a foreign key to that key.

To get back the auto incremented key value generated by the DBMS use LAST_INSERT_ID():

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(LAST_INSERT_ID(),'valueA','valueB');

This is what it is for. But here are the problems if you don’t use it.

First, if you are not in a serialized transaction then you must use LAST_INSERT_ID(). Because after your table1 insert but before your table2 insert others could have added rows and/or deleted rows including your new row and/or changed rows including your new row. So you cannot rely on querying table1 after its insert get some customerId value that you know you added.

Second, suppose you are in a serialized transaction and you don’t use LAST_INSERT_ID().

If (CustomerName,Address,State) is also a superkey of table1, ie its values are unique, ie SQL UNIQUE/KEY/PK is declared on all or some of its columns, then you can use it to query for the associated new customerId:

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName = 'value1'
    AND Address = 'value2'
    AND State = 'value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

But if (CustomerName,Address,State) is not a superkey of table1 then you cannot do this. Because other rows that are duplicates for that subrow could be in table1. So you could get multiple rows back. So you would not know which is the newest one. Instead you have to query table1 before the insert, then insert, then find the difference between the old and new sets of customerIds:

CREATE TEMPORARY TABLE table1old (
    customerId (int) PRIMARY KEY
    );
INSERT INTO table1old
SELECT customerId FROM table1;

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName NOT IN table1old);
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

Just use LAST_INSERT_ID().

PS: Interestingly, given the table definitions, ideally one could write:

INSERT INTO (
    SELECT CustomerName,Address,State,A,B
    FROM table1 JOIN table2
    USING (CustomerId))
VALUES('value1','value2','value3','valueA','valueB')

since there is just one pair of new table1 & table2 values that can result. There are some legal updates through views in SQL, although none involving multiple tables in MySQL currently

The table2 foreign key constraint means that any table2 customerId value must appear as a customerId in table1. You are getting the error because you are inserting a customerID into table2 that doesn’t appear in table1.

Since the DBMS is generating table1 customerIDs by auto increment, if you insert a row you have to get that value in order to insert a row using that customerID into table2.

I guess you say «I already established a relationship between table1 and table2» to mean «I declared a foreign key constraint». And I guess you think that means «after I insert into table1 the DBMS will use the auto-generated key value as the foreign key value when I insert into table2». But it doesn’t mean that. You have to do that yourself. The foreign key constraint just means that the DBMS checks that every table2 customerId value appears as a table1 customerId value.

You can and must use any previously inserted key value as the corresponding value when you insert into a table with a foreign key to that key.

To get back the auto incremented key value generated by the DBMS use LAST_INSERT_ID():

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(LAST_INSERT_ID(),'valueA','valueB');

This is what it is for. But here are the problems if you don’t use it.

First, if you are not in a serialized transaction then you must use LAST_INSERT_ID(). Because after your table1 insert but before your table2 insert others could have added rows and/or deleted rows including your new row and/or changed rows including your new row. So you cannot rely on querying table1 after its insert get some customerId value that you know you added.

Second, suppose you are in a serialized transaction and you don’t use LAST_INSERT_ID().

If (CustomerName,Address,State) is also a superkey of table1, ie its values are unique, ie SQL UNIQUE/KEY/PK is declared on all or some of its columns, then you can use it to query for the associated new customerId:

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName = 'value1'
    AND Address = 'value2'
    AND State = 'value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

But if (CustomerName,Address,State) is not a superkey of table1 then you cannot do this. Because other rows that are duplicates for that subrow could be in table1. So you could get multiple rows back. So you would not know which is the newest one. Instead you have to query table1 before the insert, then insert, then find the difference between the old and new sets of customerIds:

CREATE TEMPORARY TABLE table1old (
    customerId (int) PRIMARY KEY
    );
INSERT INTO table1old
SELECT customerId FROM table1;

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName NOT IN table1old);
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

Just use LAST_INSERT_ID().

PS: Interestingly, given the table definitions, ideally one could write:

INSERT INTO (
    SELECT CustomerName,Address,State,A,B
    FROM table1 JOIN table2
    USING (CustomerId))
VALUES('value1','value2','value3','valueA','valueB')

since there is just one pair of new table1 & table2 values that can result. There are some legal updates through views in SQL, although none involving multiple tables in MySQL currently

#1 30.03.2017 06:46:14

Ошибка SQLSTATE[42S21]

Формирую миграцию по изменению таблицы

php artisan make:migration ChangeArticlesTable —table=articles
Миграция происходит успешно.

Далее открываю файл миграции, вношу записи по формировании связи с другой таблицей
    $table->integer(‘user_id’)->unsigned()->default(1);
    $table->foreign(‘user_id’)->references(‘id’)->on(‘users’);         
     $table->integer(‘category_id’)->unsigned()->default(1);
     $table->foreign(‘category_id’)->references(‘id’)->on(‘categories’);
Дальше необходимо внести изменения командой
php artisan migrate

Но изменения не вносятся, появляется сообщение об ошибке:

[IlluminateDATABASEQueryException]
SQLSTATE[42S21]: COLUMN already EXISTS: 1060 Duplicate COLUMN name ‘user_id’
(SQL: ALTER TABLE ‘articles’ ADD ‘user_id’ INT UNSIGNED NOT NULL DEFAULT ‘1’, ADD ‘catego ry_id’ INT UNSIGNED NOT NULL DEFAULT ’l’)

[PDOException]
SQLSTATE[42S21]: COLUMN already EXISTS: I960 Duplicate COLUMN name ’user_id’

В чем тут может быть проблема? Конечно, колонки у меня уже есть, но мне нужно выстроить взаимосвязи между таблицами.

#2 30.03.2017 07:45:50

Re: Ошибка SQLSTATE[42S21]

почему связи вообще в миграции-то? туда только колонки добавляются, а связи – в моделях. только если внешние ключи добавить, но если сайт не в продакшене, тогда проще добавить их в ту миграцию где таблица создаётся и заново пересоздать базу. и ещё если не нужны каскадные эффекты, тогда внешние ключи вообще не нужны

#3 30.03.2017 08:20:10

Re: Ошибка SQLSTATE[42S21]

constb пишет:

почему связи вообще в миграции-то? туда только колонки добавляются, а связи – в моделях. только если внешние ключи добавить, но если сайт не в продакшене, тогда проще добавить их в ту миграцию где таблица создаётся и заново пересоздать базу. и ещё если не нужны каскадные эффекты, тогда внешние ключи вообще не нужны

Благодарю! Правильно поправил меня, мне действительно нужно установить внешние ключи. Но тот алгоритм по внешним ключам который я делаю должен выполняться, но где-то ошибка. У меня вначале вообще не устанавливались таблицы, установил только когда перешел mySQL на 5.7-64. Не знаю, может быть есть какой то другой алгоритм действий есть по установлению внешних ключей.

#4 30.03.2017 10:09:57

skiphog

Откуда: Киров, Россия
Сообщений: 26

Re: Ошибка SQLSTATE[42S21]

SZV пишет:

… У меня вначале вообще не устанавливались таблицы, установил только когда перешел mySQL на 5.7-64

Документация https://laravel.com/docs/5.4/migrations#indexes

Laravel 5.4 по умолчанию использует кодировку utf8mb4, которая включает в себя поддержку смайлов «emoji»
Если вы хотите использовать mysql 5.6, то можно в AppServiceProvider => boot добавить Schema::defaultStringLength(191);
либо пойти в config => database и в настройках mysql сменить кодировку utf8mb4 на utf8 и collation на utf8_unicode_ci, но тогда поддержки «emoji» не будет…

Теперь, что касается миграции…

Мускул же вам понятно написал причину ошибки.
Вы пытаетесь добавить столбец, который уже существует в таблице.
Вы уже создавали этот столбец в предыдущей миграции, верно? Если вы действительно хотите его изменить, то добавьте ->change()

$table->integer(‘user_id’)->unsigned()->default(1)->change();
*должен быть установлен doctrine/dbal

Если вам не нужно менять столбец, а нужно только связать ключи, то эту строку вообще удалите, но учтите, что для связывания user_id должен быть unsigned, иначе опять выскочит ошибка.

#5 30.03.2017 12:25:03

Re: Ошибка SQLSTATE[42S21]

skiphog пишет:

SZV пишет:

… У меня вначале вообще не устанавливались таблицы, установил только когда перешел mySQL на 5.7-64

Документация https://laravel.com/docs/5.4/migrations#indexes

Laravel 5.4 по умолчанию использует кодировку utf8mb4, которая включает в себя поддержку смайлов «emoji»
Если вы хотите использовать mysql 5.6, то можно в AppServiceProvider => boot добавить Schema::defaultStringLength(191);
либо пойти в config => database и в настройках mysql сменить кодировку utf8mb4 на utf8 и collation на utf8_unicode_ci, но тогда поддержки «emoji» не будет…

Теперь, что касается миграции…

Мускул же вам понятно написал причину ошибки.
Вы пытаетесь добавить столбец, который уже существует в таблице.
Вы уже создавали этот столбец в предыдущей миграции, верно? Если вы действительно хотите его изменить, то добавьте ->change()

$table->integer(‘user_id’)->unsigned()->default(1)->change();
*должен быть установлен doctrine/dbal

Если вам не нужно менять столбец, а нужно только связать ключи, то эту строку вообще удалите, но учтите, что для связывания user_id должен быть unsigned, иначе опять выскочит ошибка.

Вы правы. Добавил ->change(). Немного продвминулся в решении проблемы, но вышла другая ошибка
«[RuntimeException]
Changing columns for table «articles» requires Doctrine DBAL; install «doctrine/dba 1″.»

Т.е. то о чем Вы пишите. Добавить doctrine/dba 1.

Смею спросить а как правильно установить этот doctrine/dba 1.
Нашел:
«Если вы используете функцию renameColumn в ваших миграциях, то вам надо будет добавить зависимость doctrine/dbal в ваш файл composer.json. Этот пакет больше не входит в Laravel по умолчанию.»

Где находится файл composer.json. что за зависимость необходимо добавить? Я так понимаю, что по умолчанию в Laravel сейчас нет doctrine/dba. Может быть внешние ключи можно установить неким более простым способом? Или все таки установить doctrine, но опять же как?

#6 30.03.2017 14:09:35

Re: Ошибка SQLSTATE[42S21]

ещё раз – если не используешь каскадные эффекты, внешние ключи в mysql добавлять не нужно. связи моделей не используют foreign keys никак вообще, и от их наличия или отсутствия не зависят. внешние ключи нужны только в связке с on cascade delete, on cascade update и on cascade set null.

composer.json находится в корне проекта, doctrine/dbal – это не доктрина, это только её DataBase Abstraction Layer, устанавливается командой composer require doctrine/dbal в корне проекта, нужна только для сложных миграций, то есть не всем и не всегда – потому в стандартную установку и не входит

#7 30.03.2017 14:33:57

skiphog

Откуда: Киров, Россия
Сообщений: 26

Re: Ошибка SQLSTATE[42S21]

SZV пишет:

Может быть внешние ключи можно установить неким более простым способом?

Судя по «mySQL 5.7-64» у вас установлен OpenServer? Там есть PhpMyadmin.
Зайдите туда, выберите вашу БД и выполните запрос
Для юзеров

alter table articles add foreign key articles_user_id_foreign (user_id) references users(id)

И для категорий

alter table articles add foreign key articles_category_id_foreign (category_id) references categories(id)

Ну и да. Вам уже написали

constb пишет:

…внешние ключи нужны только в связке с on cascade delete, on cascade update и on cascade set null

#8 30.03.2017 16:21:51

Re: Ошибка SQLSTATE[42S21]

skiphog пишет:

SZV пишет:

Может быть внешние ключи можно установить неким более простым способом?

Судя по «mySQL 5.7-64» у вас установлен OpenServer? Там есть PhpMyadmin.
Зайдите туда, выберите вашу БД и выполните запрос
Для юзеров

alter table articles add foreign key articles_user_id_foreign (user_id) references users(id)

И для категорий

alter table articles add foreign key articles_category_id_foreign (category_id) references categories(id)

Ну и да. Вам уже написали

constb пишет:

…внешние ключи нужны только в связке с on cascade delete, on cascade update и on cascade set null

Благодарю. К таблице articles в индексах прописалась строка articles_user_id_foreign, но по прежнему нет строки  articles_category_id_foreign.
Блин, а есть более простой способ подключения внешних ключей к готовым таблицам?

#9 31.03.2017 04:44:24

Re: Ошибка SQLSTATE[42S21]

SZV, по-моему ты просто не понимаешь что такое внешний ключ в реляционных СУБД. это не поле, а ограничение (constraint). естественно у тебя никакой строки ниоткуда не появится. я третий и последний раз скажу это – тебе не нужен здесь foreign key

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка сервера authenticate plain account is temporarily unavailable
  • Ошибка сервера внутренняя ошибка сервера kyocera