Может ли кто-нибудь помочь мне с этой ошибкой синтаксиса SQL-запроса? [Дубликат]

Функция:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

Тест:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);
94
задан Bill Karwin 28 December 2017 в 20:03
поделиться

19 ответов

Общее сообщение «errno 150» от MySQL « означает, что ограничение внешнего ключа было неправильно сформировано ». Как вы, вероятно, уже знаете, читаете ли вы эту страницу, общая ошибка «errno: 150» сообщение действительно бесполезно. Однако:

Вы можете получить сообщение об ошибке actual , запустив SHOW ENGINE INNODB STATUS;, а затем ищите LATEST FOREIGN KEY ERROR на выходе.

Например, это попытайтесь создать ограничение внешнего ключа:

CREATE TABLE t1
(id INTEGER);

CREATE TABLE t2
(t1_id INTEGER,
 CONSTRAINT FOREIGN KEY (t1_id) REFERENCES t1 (id));

терпит неудачу с ошибкой Can't create table 'test.t2' (errno: 150). Это не говорит никому ничего полезного, кроме того, что это проблема внешнего ключа. Но запустите SHOW ENGINE INNODB STATUS;, и он скажет:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
130811 23:36:38 Error in foreign key constraint of table test/t2:
FOREIGN KEY (t1_id) REFERENCES t1 (id)):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

В нем говорится, что проблема в том, что он не может найти индекс. SHOW INDEX FROM t1 показывает, что для таблицы t1 вообще нет индексов. Исправьте это, скажем, определив первичный ключ на t1, и ограничение внешнего ключа будет создано успешно.

59
ответ дан andrewdotn 17 August 2018 в 10:56
поделиться
  • 1
    SHOW ENGINE INNODB STATUS помог мне сразу определить проблему, которую я пытался диагностировать почти час. Благодарю. – jatrim 29 August 2014 в 01:09

У меня была та же проблема с ALTER TABLE ADD FOREIGN KEY.

Через час я обнаружил, что эти условия должны быть выполнены, чтобы не получить ошибку 150:

  1. Родитель таблица должна существовать до того, как вы определите внешний ключ для ее ссылки. Вы должны определить таблицы в правильном порядке: сначала родительскую таблицу, затем таблицу «Дети». Если обе таблицы ссылаются друг на друга, вы должны создать одну таблицу без ограничений FK, затем создать вторую таблицу, а затем добавить ограничение FK в первую таблицу с помощью ALTER TABLE.
  2. Обе таблицы должны поддерживать ограничения внешнего ключа, т. е. ENGINE=InnoDB. Другие механизмы хранения молча игнорируют определения внешних ключей, поэтому они не возвращают никаких ошибок или предупреждений, но ограничение FK не сохраняется.
  3. Обозначенные столбцы в родительской таблице должны быть самыми левыми столбцами ключа. Лучше, если ключ в родительском элементе PRIMARY KEY или UNIQUE KEY.
  4. Определение FK должно ссылаться на столбцы PK в том же порядке, что и определение PK. Например, если FK REFERENCES Parent(a,b,c), то PK родителя не должен быть определен в столбцах в порядке (a,c,b).
  5. Столбец PK в таблице родителя должен быть тем же типом данных, что и FK (столбцы) в таблице «Дети». Например, если столбец PK в родительской таблице равен UNSIGNED, обязательно определите UNSIGNED для соответствующего столбца в поле Child table. Исключение: длина строк может быть разной. Например, VARCHAR(10) может ссылаться на VARCHAR(20) или наоборот.
  6. Любые столбцы (строки) FK строкового типа должны иметь одинаковый набор символов и сопоставление в качестве соответствующих столбцов (столбцов) PK.
  7. Если в таблице «Дети» есть данные, каждое значение в столбце (столбцах) FK должно соответствовать значению в столбце (столбцах) столбца «Родительская таблица». Проверьте это с помощью запроса типа:
    SELECT COUNT(*) FROM Child LEFT OUTER JOIN Parent ON Child.FK = Parent.PK 
    WHERE Parent.PK IS NULL;
    
    Это должно возвращать ноль (0) непревзойденные значения. Очевидно, что этот запрос является общим примером; вы должны подставить свои имена таблиц и имена столбцов.
  8. Таблица родительских элементов и таблица «Дети» могут быть таблицей TEMPORARY.
  9. Ни родительская таблица, ни таблица «Дети» не могут быть a PARTITIONED.
  10. Если вы объявляете FK с опцией ON DELETE SET NULL, то столбец FK должен быть нулевым.
  11. Если вы объявляете имя ограничения для внешний ключ, имя ограничения должно быть уникальным во всей схеме, а не только в таблице, в которой определено ограничение.

Надеюсь, что это поможет.

225
ответ дан Bill Karwin 17 August 2018 в 10:56
поделиться
  • 1
    Это помогает, спасибо. – Timo Huovinen 9 May 2012 в 10:26
  • 2
    еще одна вещь стоит добавить: если PK родительской таблицы больше, чем одно поле, порядок полей в FK должен быть таким же, как и порядок в PK – Kip 9 May 2012 в 21:44
  • 3
    Сюда относятся такие вещи, как int(11) unsigned NOT NULL vs int(11) NOT NULL. – Glen Solsberry 1 May 2013 в 21:37
  • 4
    ALTER TABLE имя_таблицы ENGINE = InnoDB; – TolMera 24 July 2013 в 04:15
  • 5
    Если таблица определена ENGINE = MyISAM, она не генерирует errno 150, потому что она игнорирует объявления внешних ключей. Это как сказать, что лучший способ избежать неприятностей с вашим автомобильным двигателем - это водить лодку. :-) – Bill Karwin 11 October 2013 в 18:18

Если ограничение внешнего ключа основано на типе varchar, то в дополнение к списку , предоставленному marv-el , целевой столбец должен иметь уникальное ограничение.

0
ответ дан Community 17 August 2018 в 10:56
поделиться

MySQL Workbench 6.3 для Mac OS.

Проблема: errno 150 в таблице X при попытке сделать Forward Engineering на диаграмме DB, 20 из 21 удалось, 1 не удалось. Если FKs на таблице X были удалены, ошибка переместилась в другую таблицу, которая не была провалена раньше.

Изменен механизм всех таблиц для myISAM, и он работал нормально.

1
ответ дан Eduardo Chongkan 17 August 2018 в 10:56
поделиться

Для других, которые находят эту запись SO через Google: убедитесь, что вы не пытаетесь выполнить действие SET NULL на столбце внешнего ключа, который будет указан как «NOT NULL». Это вызвало сильное разочарование, пока я не вспомнил, что нужно сделать CHECK ENGINE INNODB STATUS.

3
ответ дан Eric Lawler 17 August 2018 в 10:56
поделиться

Определенно это не так, но я нашел эту ошибку довольно распространенной и неочевидной. Целью FOREIGN KEY может быть не PRIMARY KEY. Ответ, который мне пригодится, - это:

ИНОСТРАННЫЙ КЛЮЧ всегда нужно указывать на истинное поле PRIMARY KEY другой таблицы.

CREATE TABLE users(
   id INT AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(40));

CREATE TABLE userroles(
   id INT AUTO_INCREMENT PRIMARY KEY,
   user_id INT NOT NULL,
   FOREIGN KEY(user_id) REFERENCES users(id));
3
ответ дан I159 17 August 2018 в 10:56
поделиться
  • 1
    Это была моя проблема. Ужасная отчетность об ошибках, MySQL ... – Brian Stinar 12 September 2016 в 23:25

Сначала убедитесь, что

  1. вы используете таблицы InnoDB. Поле
  2. для FOREIGN KEY имеет одинаковый тип и длину (!) в качестве исходного поля.

У меня была такая же проблема, и я исправил ее. Я имел unsigned INT для одного поля и просто целое для другого поля.

2
ответ дан Inzimam Tariq IT 17 August 2018 в 10:56
поделиться

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

Часто свойство unsigned в столбце идентификатора выведет вас.

ALTER TABLE `dbname`.`tablename` CHANGE `fieldname` `fieldname` int(10) UNSIGNED NULL;
25
ответ дан Jon Winstanley 17 August 2018 в 10:56
поделиться
  • 1
    спасибо, что это правда. – Mahdi_Nine 17 March 2011 в 12:46
  • 2
    По моему опыту, стоит использовать SHOW CREATE TABLE MySQL в вашей основной таблице, чтобы точно проверить, какие флаги установлены против вашего основного столбца индекса, а затем скопировать их в столбец внешнего ключа. Там могут быть такие вещи, как «без знака». которые не очевидны. – Ambulare 29 September 2014 в 17:09

Для тех, кто просматривает эту тему с той же проблемой:

Есть много причин для получения таких ошибок. Для получения достаточно полного списка причин и решений ошибок внешнего ключа в MySQL (включая те, которые обсуждаются здесь), посмотрите эту ссылку:

Ошибки внешнего ключа MySQL и Errno 150

5
ответ дан juacala 17 August 2018 в 10:56
поделиться

В моем случае это было связано с тем, что поле, являющееся полем внешнего ключа, имеет слишком длинное имя, т. е. foreign key (some_other_table_with_long_name_id). Попробуйте коротко. В этом случае сообщение об ошибке немного вводит в заблуждение.

Кроме того, как упоминалось ранее @Jon, определения полей должны быть одинаковыми (обратите внимание на подтип unsigned).

0
ответ дан Kangur 17 August 2018 в 10:56
поделиться

Как указано @andrewdotn, лучший способ - увидеть подробную ошибку (SHOW ENGINE INNODB STATUS;) вместо кода ошибки.

Одна из причин может заключаться в том, что индекс уже существует с тем же имя, может быть в другой таблице. Как практика, я рекомендую имя таблицы префикса перед именем индекса, чтобы избежать таких столкновений. например вместо idx_userId используйте idx_userActionMapping_userId.

3
ответ дан MuchMore 17 August 2018 в 10:56
поделиться

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

0
ответ дан Raza 17 August 2018 в 10:56
поделиться

(Боковые заметки слишком большие для комментария)

Нет необходимости в идентификаторе AUTO_INCREMENT в таблице сопоставления; избавиться от него.

Измените PRIMARY KEY на (role_id, role_group_id) (в любом порядке). Это сделает доступ быстрее.

Поскольку вы, вероятно, хотите сопоставить оба направления, также добавьте INDEX с этими двумя столбцами в обратном порядке. (Нет необходимости делать это UNIQUE.)

Дополнительные советы: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

0
ответ дан Rick James 17 August 2018 в 10:56
поделиться

Каково текущее состояние вашей базы данных при запуске этого скрипта? Он полностью пуст? Ваш SQL работает отлично для меня при создании базы данных с нуля, но errno 150 обычно имеет дело с dropping & amp; воссоздание таблиц, которые являются частью внешнего ключа. Я получаю ощущение, что вы не работаете со 100% новой и новой базой данных.

Если вы ошибаетесь, когда «источник» - ваш файл SQL, вы должны иметь возможность запускать команду «SHOW ENGINE INNODB STATUS» из приглашения MySQL сразу после команды «source», чтобы увидеть более подробную информацию об ошибке.

Возможно, вы захотите также проверить ввод вручную:

Если вы воссоздали таблицу, которая была удалена, она должна иметь определение, соответствующее ограничениям внешнего ключа, ссылающимся на него. Он должен иметь правильные имена и типы столбцов, и он должен иметь индексы на ссылочных ключах, как указано ранее. Если они не выполняются, MySQL возвращает номер ошибки 1005 и ссылается на ошибку 150 в сообщении об ошибке. Если MySQL сообщает номер ошибки 1005 из инструкции CREATE TABLE, а сообщение об ошибке относится к ошибке 150, создание таблицы завершилось неудачно, потому что ограничение внешнего ключа было неправильно сформировано.

- Справочное руководство MySQL 5.1 .

10
ответ дан Sergey Brunov 17 August 2018 в 10:56
поделиться

Полезный совет, используйте SHOW WARNINGS; после попытки запроса CREATE, и вы получите сообщение об ошибке, а также более подробное предупреждение:

    ---------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                                                                                                                 |
+---------+------+--------------------------------------------------------------------------                          --------------------------------------------------------------------------------------------                          ---------------+
| Warning |  150 | Create table 'fakeDatabase/exampleTable' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns.
|
| Error   | 1005 | Can't create table 'exampleTable' (errno:150)                                                                                                                                                                           |
+---------+------+--------------------------------------------------------------------------                          --------------------------------------------------------------------------------------------                          ---------------+

Так что в этом случае время, создайте мой стол!

2
ответ дан sturrockad 17 August 2018 в 10:56
поделиться

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

0
ответ дан SystemParadox 17 August 2018 в 10:56
поделиться

Я нашел другую причину, по которой это не удается ... имена таблиц, чувствительных к регистру.

Для определения этой таблицы

CREATE TABLE user (
  userId int PRIMARY KEY AUTO_INCREMENT,
  username varchar(30) NOT NULL
) ENGINE=InnoDB;

Это определение таблицы работает

CREATE TABLE product (
  id int PRIMARY KEY AUTO_INCREMENT,
  userId int,
  FOREIGN KEY fkProductUser1(userId) REFERENCES **u**ser(userId)
) ENGINE=InnoDB;

, тогда как этот не работает

CREATE TABLE product (
  id int PRIMARY KEY AUTO_INCREMENT,
  userId int,
  FOREIGN KEY fkProductUser1(userId) REFERENCES User(userId)
) ENGINE=InnoDB;

Тот факт, что он работал на Windows и не удался в Unix, занял у меня пару часов, чтобы понять. Надеюсь, что это поможет кому-то другому.

1
ответ дан Tim 17 August 2018 в 10:56
поделиться

Это обычно происходит, когда вы пытаетесь загрузить исходный файл в существующую базу данных. Сначала отбросьте все таблицы (или сам БД). И затем исходный файл с SET foreign_key_checks = 0; в начале и SET foreign_key_checks = 1; в конце.

1
ответ дан wholenewstrain 17 August 2018 в 10:56
поделиться

Я столкнулся с той же проблемой, но проверю, что у меня нет родительской таблицы. Поэтому я просто редактирую родительскую миграцию перед дочерней миграцией. Просто сделайте это.

-1
ответ дан 韩向飞 17 August 2018 в 10:56
поделиться
  • 1
    это должен был быть комментарий вместо ответа – hannad rehman 30 June 2018 в 06:36
Другие вопросы по тегам:

Похожие вопросы: