Функция:
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);
Общее сообщение «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
, и ограничение внешнего ключа будет создано успешно.
У меня была та же проблема с ALTER TABLE ADD FOREIGN KEY
.
Через час я обнаружил, что эти условия должны быть выполнены, чтобы не получить ошибку 150:
ALTER TABLE
. ENGINE=InnoDB
. Другие механизмы хранения молча игнорируют определения внешних ключей, поэтому они не возвращают никаких ошибок или предупреждений, но ограничение FK не сохраняется. PRIMARY KEY
или UNIQUE KEY
. REFERENCES Parent(a,b,c)
, то PK родителя не должен быть определен в столбцах в порядке (a,c,b)
. UNSIGNED
, обязательно определите UNSIGNED
для соответствующего столбца в поле Child table. Исключение: длина строк может быть разной. Например, VARCHAR(10)
может ссылаться на VARCHAR(20)
или наоборот. SELECT COUNT(*) FROM Child LEFT OUTER JOIN Parent ON Child.FK = Parent.PK
WHERE Parent.PK IS NULL;
Это должно возвращать ноль (0) непревзойденные значения. Очевидно, что этот запрос является общим примером; вы должны подставить свои имена таблиц и имена столбцов. TEMPORARY
. PARTITIONED
. ON DELETE SET NULL
, то столбец FK должен быть нулевым. Надеюсь, что это поможет.
int(11) unsigned NOT NULL
vs int(11) NOT NULL
.
– Glen Solsberry
1 May 2013 в 21:37
Если ограничение внешнего ключа основано на типе varchar
, то в дополнение к списку , предоставленному marv-el
, целевой столбец должен иметь уникальное ограничение.
MySQL Workbench 6.3 для Mac OS.
Проблема: errno 150 в таблице X при попытке сделать Forward Engineering на диаграмме DB, 20 из 21 удалось, 1 не удалось. Если FKs на таблице X были удалены, ошибка переместилась в другую таблицу, которая не была провалена раньше.
Изменен механизм всех таблиц для myISAM, и он работал нормально.
Для других, которые находят эту запись SO через Google: убедитесь, что вы не пытаетесь выполнить действие SET NULL на столбце внешнего ключа, который будет указан как «NOT NULL». Это вызвало сильное разочарование, пока я не вспомнил, что нужно сделать CHECK ENGINE INNODB STATUS.
Определенно это не так, но я нашел эту ошибку довольно распространенной и неочевидной. Целью 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));
Сначала убедитесь, что
У меня была такая же проблема, и я исправил ее. Я имел unsigned INT для одного поля и просто целое для другого поля.
Убедитесь, что свойства двух полей, которые вы пытаетесь связать с ограничением, являются точно такими же.
Часто свойство unsigned в столбце идентификатора выведет вас.
ALTER TABLE `dbname`.`tablename` CHANGE `fieldname` `fieldname` int(10) UNSIGNED NULL;
Для тех, кто просматривает эту тему с той же проблемой:
Есть много причин для получения таких ошибок. Для получения достаточно полного списка причин и решений ошибок внешнего ключа в MySQL (включая те, которые обсуждаются здесь), посмотрите эту ссылку:
В моем случае это было связано с тем, что поле, являющееся полем внешнего ключа, имеет слишком длинное имя, т. е. foreign key (some_other_table_with_long_name_id)
. Попробуйте коротко. В этом случае сообщение об ошибке немного вводит в заблуждение.
Кроме того, как упоминалось ранее @Jon, определения полей должны быть одинаковыми (обратите внимание на подтип unsigned
).
Как указано @andrewdotn, лучший способ - увидеть подробную ошибку (SHOW ENGINE INNODB STATUS;
) вместо кода ошибки.
Одна из причин может заключаться в том, что индекс уже существует с тем же имя, может быть в другой таблице. Как практика, я рекомендую имя таблицы префикса перед именем индекса, чтобы избежать таких столкновений. например вместо idx_userId
используйте idx_userActionMapping_userId
.
Убедитесь, что внешние ключи не указаны как уникальные в родительском. У меня была такая же проблема, и я решил ее, демаркируя ее как не уникальную.
(Боковые заметки слишком большие для комментария)
Нет необходимости в идентификаторе AUTO_INCREMENT
в таблице сопоставления; избавиться от него.
Измените PRIMARY KEY
на (role_id, role_group_id)
(в любом порядке). Это сделает доступ быстрее.
Поскольку вы, вероятно, хотите сопоставить оба направления, также добавьте INDEX
с этими двумя столбцами в обратном порядке. (Нет необходимости делать это UNIQUE
.)
Дополнительные советы: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Каково текущее состояние вашей базы данных при запуске этого скрипта? Он полностью пуст? Ваш SQL работает отлично для меня при создании базы данных с нуля, но errno 150 обычно имеет дело с dropping & amp; воссоздание таблиц, которые являются частью внешнего ключа. Я получаю ощущение, что вы не работаете со 100% новой и новой базой данных.
Если вы ошибаетесь, когда «источник» - ваш файл SQL, вы должны иметь возможность запускать команду «SHOW ENGINE INNODB STATUS» из приглашения MySQL сразу после команды «source», чтобы увидеть более подробную информацию об ошибке.
Возможно, вы захотите также проверить ввод вручную:
Если вы воссоздали таблицу, которая была удалена, она должна иметь определение, соответствующее ограничениям внешнего ключа, ссылающимся на него. Он должен иметь правильные имена и типы столбцов, и он должен иметь индексы на ссылочных ключах, как указано ранее. Если они не выполняются, MySQL возвращает номер ошибки 1005 и ссылается на ошибку 150 в сообщении об ошибке. Если MySQL сообщает номер ошибки 1005 из инструкции CREATE TABLE, а сообщение об ошибке относится к ошибке 150, создание таблицы завершилось неудачно, потому что ограничение внешнего ключа было неправильно сформировано.
blockquote>
Полезный совет, используйте 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) |
+---------+------+-------------------------------------------------------------------------- -------------------------------------------------------------------------------------------- ---------------+
Так что в этом случае время, создайте мой стол!
Также стоит проверить, что вы случайно не работаете с неправильной базой данных. Эта ошибка возникает, если внешняя таблица не существует. Почему MySQL должен быть настолько загадочным?
Я нашел другую причину, по которой это не удается ... имена таблиц, чувствительных к регистру.
Для определения этой таблицы
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, занял у меня пару часов, чтобы понять. Надеюсь, что это поможет кому-то другому.
Это обычно происходит, когда вы пытаетесь загрузить исходный файл в существующую базу данных. Сначала отбросьте все таблицы (или сам БД). И затем исходный файл с SET foreign_key_checks = 0;
в начале и SET foreign_key_checks = 1;
в конце.
Я столкнулся с той же проблемой, но проверю, что у меня нет родительской таблицы. Поэтому я просто редактирую родительскую миграцию перед дочерней миграцией. Просто сделайте это.
SHOW ENGINE INNODB STATUS
помог мне сразу определить проблему, которую я пытался диагностировать почти час. Благодарю. – jatrim 29 August 2014 в 01:09