В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Я бы рекомендовал использовать INSERT...ON DUPLICATE KEY UPDATE
.
Если вы используете INSERT IGNORE
, тогда строка на самом деле не будет вставлена, если она приведет к дублированию ключа. Но оператор не будет генерировать ошибку. Вместо этого он генерирует предупреждение. Эти случаи включают в себя:
PRIMARY KEY
или UNIQUE
. NOT NULL
. Если вы используете REPLACE
, MySQL фактически выполняет DELETE
, а внутри INSERT
, у которого есть некоторые неожиданные побочные эффекты:
REPLACE
. DELETE
выполняются без необходимости. исправление: оба REPLACE
и INSERT...ON DUPLICATE KEY UPDATE
являются нестандартными, запатентованными изобретениями специфичный для MySQL. ANSI SQL 2003 определяет оператор MERGE
, который может решить одну и ту же потребность (и многое другое), но MySQL не поддерживает инструкцию MERGE
.
Пользователь попытался отредактировать это сообщение ( изменение было отклонено модераторами). Редактирование попыталось добавить утверждение о том, что INSERT...ON DUPLICATE KEY UPDATE
вызывает выделение нового идентификатора автоматического инкремента. Это правда, что новый идентификатор сгенерирован , но он не используется в измененной строке.
См. Демонстрацию ниже, протестированную с Percona Server 5.5.28. Конфигурационная переменная innodb_autoinc_lock_mode=1
(по умолчанию):
mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
+----+------+
| id | u |
+----+------+
| 1 | 10 |
+----+------+
mysql> show create table foo\G
CREATE TABLE `foo` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`u` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
+----+------+
| id | u |
+----+------+
| 1 | 20 |
+----+------+
mysql> show create table foo\G
CREATE TABLE `foo` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`u` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
Вышеописанное показывает, что оператор IODKU обнаруживает дубликат и вызывает обновление для изменения значения u
. Обратите внимание, что AUTO_INCREMENT=3
указывает, что идентификатор был сгенерирован, но не использовался в строке.
В то время как REPLACE
удаляет исходную строку и вставляет новую строку, генерируя и новый идентификатор автоинкремента:
mysql> select * from foo;
+----+------+
| id | u |
+----+------+
| 1 | 20 |
+----+------+
mysql> replace into foo (u) values (20);
mysql> select * from foo;
+----+------+
| id | u |
+----+------+
| 3 | 20 |
+----+------+
Я знаю, что это старо, но я добавлю это примечание на тот случай, если кто-то еще (например, я) прибудет на эту страницу, пытаясь найти информацию о INSERT..IGNORE.
Как упоминалось выше, если вы используете INSERT..IGNORE, ошибки, возникающие во время выполнения инструкции INSERT, рассматриваются как предупреждения.
. Одна вещь, которая явно не упоминается, заключается в том, что INSERT..IGNORE приведет к тому, что недопустимые значения будут скорректированы для самые близкие значения при вставке (тогда как недопустимые значения приведут к отмене запроса, если ключевое слово IGNORE не использовалось).
ON DUPLICATE KEY UPDATE в стандарте не действительно . Это стандартно, как REPLACE. См. SQL MERGE .
По сути, обе команды являются альтернативными версиями синтаксиса стандартных команд.
Я обычно использую INSERT IGNORE
, и это похоже на то, какое поведение вы ищите. Пока вы знаете, что строки, которые вызовут конфликты индекса, не будут вставлены, и вы планируете свою программу соответственно, это не должно вызывать никаких проблем.
Если вы хотите вставить в таблицу и в конфликт первичного ключа или уникальный индекс, он будет обновлять конфликтующую строку вместо вставки этой строки.
Синтаксис:
insert into table1 set column1 = a, column2 = b on duplicate update column2 = c;
Теперь здесь этот оператор вставки может выглядеть по-другому, что вы видели ранее. Этот оператор insert пытается вставить строку в таблицу1 со значениями a и b в столбец столбца1 и столбец 2. соответственно.
Понятно, что этот подробный отчет:
Например: здесь column1 определяется как первичный ключ в таблице 1.
Теперь, если в таблице 1 нет строки, имеющей значение «a» в столбце 1. Поэтому этот оператор будет вставлять строку в таблицу.
Теперь, если в таблице 1 есть строка со значением «a» в столбце2. Таким образом, этот оператор обновит значение столбца строки с «c», где значение столбца «a».
Итак, если вы хотите вставить новую строку, иначе обновите эту строку в конфликте первичного ключа или уникальный индекс. Подробнее об этой ссылке
Потенциальная опасность INSERT IGNORE. Если вы пытаетесь вставить значение VARCHAR дольше, тогда столбец был определен с: - значение будет усечено и вставлено. EVEN IF строгий режим включен.
Если вы хотите увидеть, что все это значит, вот удар по всему:
CREATE TABLE `users_partners` (
`uid` int(11) NOT NULL DEFAULT '0',
`pid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`,`pid`),
KEY `partner_user` (`pid`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Основной ключ основан на обоих столбцах этой таблицы быстрого сравнения. Первичный ключ требует уникальных значений.
Начнем:
INSERT INTO users_partners (uid,pid) VALUES (1,1);
...1 row(s) affected
INSERT INTO users_partners (uid,pid) VALUES (1,1);
...Error Code : 1062
...Duplicate entry '1-1' for key 'PRIMARY'
INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1);
...0 row(s) affected
INSERT INTO users_partners (uid,pid) VALUES (1,1) ON DUPLICATE KEY UPDATE uid=uid
...0 row(s) affected
обратите внимание, что выше сохранена слишком большая дополнительная работа, установив столбец равным самому себе, никакого обновления на самом деле не требуется
REPLACE INTO users_partners (uid,pid) VALUES (1,1)
...2 row(s) affected
, а теперь несколько тестов с несколькими строками:
INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...Error Code : 1062
...Duplicate entry '1-1' for key 'PRIMARY'
INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...3 row(s) affected
в консоли не было создано никаких других сообщений, и теперь в этих таблицах теперь есть эти 4 значения. Я удалил все, кроме (1,1), чтобы я мог протестировать с одного и того же игрового поля
INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4) ON DUPLICATE KEY UPDATE uid=uid
...3 row(s) affected
REPLACE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...5 row(s) affected
Итак, у вас оно есть. Так как все это было сделано на свежем столе с почти отсутствием данных, а не на производстве, времена для выполнения были микроскопическими и неактуальными. Любой, кто имеет данные в реальном мире, будет более чем рад внести свой вклад.
INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
.
– Floris
24 May 2014 в 16:36
Что-то важное для добавления: при использовании INSERT IGNORE и у вас есть ключевые нарушения, MySQL НЕ поднимет предупреждение!
Если вы попытаетесь, например, вставить 100 записей за раз, с одной неисправной , вы попадете в интерактивный режим:
Query OK, 99 rows affected (0.04 sec)
blockquote>
Records: 100 Duplicates: 1 Warnings: 0
Как видите: Нет предупреждений! Это поведение даже ошибочно описано в официальной документации Mysql.
Если ваш скрипт должен быть проинформирован, если некоторые записи не были добавлены (из-за нарушений ключа), вы должны вызвать mysql_info () и проанализировать его для значения «Duplicates».
mysqli_affected_rows()
, чтобы узнать, действительно ли INSERT
произошло.
– Amal Murali
23 December 2013 в 07:44
Cannot add or update a child row: a foreign key constraint fails
, а строки i> (даже действительные) не добавляются.
– Floris
24 May 2014 в 16:52
INSERT IGNORE
дублирующие ключи игнорируются без ошибок или предупреждений.
– toxalot
31 October 2014 в 13:42
Если при использовании insert ignore
, имеющего оператор SHOW WARNINGS;
в конце вашего набора запросов, будет отображаться таблица со всеми предупреждениями, в том числе идентификаторы которых являются дубликатами.
Replace
Входит как опция. Или вы можете проверить с помощью
IF NOT EXISTS(QUERY) Then INSERT
Это вставляет или удаляет, а затем вставляет. Сначала я предпочитаю проверку IF NOT EXISTS
.
REPLACE
удаляет все строки в таблице с помощью сочетания any i> PRIMARY
или UNIQUE
, , затем i> INSERTs
. Это потенциально намного больше работы, чем IODKU.
– Rick James
30 January 2017 в 03:32
INSERT ... ON DUPLICATE KEY UPDATE ...
утверждений. Много данных дублируется, и это привело к тому, что один экземпляр AI PK увеличился с 17 029 941 до 46 271 740 между двумя рядами. Это поколение нового ИИ каждый раз означает, что ваш диапазон может быть очень быстро заполнен, и вам нужно очистить его. Эта таблица всего две недели! – Ant The Knee 10 July 2014 в 19:21