Spec-Zone .ru
спецификации, руководства, описания, API
|
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
,...)] [(col_name
,...)] {VALUES | VALUE} ({expr
| DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATEcol_name
=expr
[,col_name
=expr
] ... ]
Или:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
,...)] SETcol_name
={expr
| DEFAULT}, ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
[,col_name
=expr
] ... ]
Или:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
,...)] [(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
[,col_name
=expr
] ... ]
INSERT
вставляет новые строки в существующую таблицу. INSERT ... VALUES
и INSERT
... SET
формы оператора вставляют строки, основанные на явно указанных значениях. INSERT ... SELECT
форма вставляет строки, выбранные из другой таблицы или таблиц.
INSERT ... SELECT
обсуждается далее в Разделе
13.2.5.1,"INSERT ... SELECT
Синтаксис".
В MySQL 5.6.2 и позже, вставляя в разделенную таблицу, можно управлять, какие разделы и подразделы принимают
новые строки. PARTITION
опция берет список разделенных запятой значений имен одного
или более разделов или подразделов (или оба) таблицы. Если любая из строк, которые будут вставлены данным INSERT
оператор не соответствует один из перечисленных разделов, INSERT
оператор перестал работать с ошибкой, Найденной строкой, не соответствующей данный установленный раздел.
См. Раздел
18.5, "Выбор Раздела", для получения дополнительной информации и примеры.
Можно использовать REPLACE
вместо INSERT
перезаписывать старые строки. REPLACE
дубликат к INSERT
IGNORE
в обработке новых строк, которые содержат значения уникального ключа, которые копируют старые
строки: новые строки используются, чтобы заменить старые строки вместо того, чтобы быть отброшенным. См. Раздел 13.2.8,"REPLACE
Синтаксис".
tbl_name
таблица, в которую должны быть вставлены строки. Столбцы, для
которых оператор обеспечивает значения, могут быть определены следующим образом:
Можно обеспечить список разделенных запятой значений имен столбцов после имени
таблицы. В этом случае значение для каждого именованного столбца должно быть обеспечено VALUES
список или SELECT
оператор.
Если Вы не определяете список имен столбцов для INSERT ... VALUES
или INSERT ... SELECT
, значения для каждого столбца в таблице должны быть
обеспечены VALUES
список или SELECT
оператор. Если Вы не знаете порядка столбцов в таблице,
использовать DESCRIBE
узнать. tbl_name
SET
пункт указывает на имена столбцов явно.
Значения столбцов могут быть даны несколькими способами:
Если Вы не работаете в строгом режиме SQL, никакой столбец, не явно заданный, значение устанавливается в его значение по умолчанию (явный или неявный) значение. Например, если Вы определяете список столбцов, который не называет все столбцы в таблице, неназванные столбцы устанавливаются в их значения по умолчанию. Присвоение значения по умолчанию описывается в Разделе 11.5, "Значения по умолчанию Типа данных". См. также Раздел 1.8.6.3, "Ограничения на Недопустимые Данные".
Если Вы хотите INSERT
оператор, чтобы генерировать ошибку, если Вы явно не
определяете значения для всех столбцов, у которых нет значения по умолчанию, следует использовать
строгий режим. См. Раздел 5.1.7, "Режимы SQL
Сервера".
Используйте ключевое слово DEFAULT
установить столбец
явно в его значение по умолчанию. Это облегчает писать INSERT
операторы, которые присваивают значения всем кроме нескольких
столбцов, потому что это позволяет Вам избежать писать неполное VALUES
список, который не включает значение для каждого столбца в таблице. Иначе, необходимо бы выписать список
имен столбцов, соответствующих каждому значению в VALUES
список.
Можно также использовать DEFAULT(
как более
общая форма, которая может использоваться в выражениях, чтобы произвести значение по умолчанию
данного столбца. col_name
)
Если и список столбцов и VALUES
список пуст, INSERT
создает строку с каждым набором столбца к его значению по умолчанию:
INSERT INTO tbl_name
() VALUES();
В строгом режиме происходит ошибка, если у какого-либо столбца нет значения по умолчанию. Иначе, MySQL использует неявное значение по умолчанию для любого столбца, у которого нет явно определенного значения по умолчанию.
Можно определить выражение expr
обеспечить значение столбца. Это могло бы включить преобразование типов, если тип выражения не
соответствует тип столбца, и преобразование данного значения может привести к различным вставленным
значениям в зависимости от типа данных. Например, вставка строки '1999.0e-2'
в INT
, FLOAT
, DECIMAL(10,6)
, или YEAR
столбец приводит к значениям 1999
, 19.9921
,
19.992100
, и 1999
быть вставленным,
соответственно. Причина значение, сохраненное в INT
и YEAR
столбцы 1999
это взгляды
преобразования строки к целому числу только на такое большое количество начальной части строки, как
может считаться допустимым целым числом или год. Для столбцов с плавающей точкой и столбцов
фиксированной точки, преобразование строки к плавающей точке считает всю строку допустимым значением с
плавающей точкой.
Выражение expr
может обратиться к любому столбцу, который
был установлен ранее в списке значения. Например, можно сделать это потому что значение для col2
обращается к col1
, который был
ранее присвоен:
INSERT INTO tbl_name
(col1,col2) VALUES(15,col1*2);
Но следующее не является законным, потому что значение для col1
обращается к col2
, который присваивается после col1
:
INSERT INTO tbl_name
(col1,col2) VALUES(col2*2,15);
Одно исключение включает столбцы, которые содержат AUTO_INCREMENT
значения. Поскольку AUTO_INCREMENT
значение сгенерировано после других
присвоений значения, любой ссылки на AUTO_INCREMENT
столбец в
присвоении возвращает a 0
.
INSERT
операторы то использование VALUES
синтаксис
может вставить многократные строки. Чтобы сделать это, включайте многократные списки значений столбцов, каждый
включенный в пределах круглых скобок и разделенный запятыми. Пример:
INSERT INTO tbl_name
(a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Список значений для каждой строки должен быть включен в пределах круглых скобок. Следующий оператор недопустим, потому что число значений в списке не соответствует число имен столбцов:
INSERT INTO tbl_name
(a,b,c) VALUES(1,2,3,4,5,6,7,8,9);
VALUE
синоним для VALUES
в этом контексте. Ни один
ничего не подразумевает о числе списков значений, и или может использоваться, есть ли единственный список
значений или многократные списки.
Влиявшие строки оценивают за INSERT
может быть получен, используя ROW_COUNT()
функция (см. Раздел 12.14,
"информационные Функции"), или mysql_affected_rows()
C API-функция (см. Раздел 22.8.7.1,"mysql_affected_rows()
"
).
Если Вы используете INSERT ... VALUES
оператор с многократными списками значения или INSERT ... SELECT
, оператор возвращает информационную строку в этом формате:
Records: 100 Duplicates: 0 Warnings: 0
Records
указывает на число строк, обработанных оператором. (Это - не обязательно
число строк, фактически вставленных потому что Duplicates
может быть ненулевым.)
Duplicates
указывает на число строк, которые не могли быть вставлены, потому что
они копируют некоторое существующее значение уникального индекса. Warnings
указывает на число попыток вставить значения столбцов, которые были проблематичны в некотором роде.
Предупреждения могут произойти при любом из следующих условий:
Вставка NULL
в столбец, который был объявлен NOT NULL
. Для многократной строки INSERT
операторы или INSERT INTO ... SELECT
операторы, столбец устанавливается в неявное
значение по умолчанию для типа данных столбца. Это 0
для числовых типов,
пустая строка (''
) для строковых типов, и "нулевого" значения для даты и типов времени. INSERT INTO ...
SELECT
операторы обрабатываются тот же самый путь, как многократная строка вставляет,
потому что сервер не исследует набор результатов от SELECT
видеть, возвращает ли это единственную строку. (Для
единственной строки INSERT
, никакое предупреждение не происходит когда NULL
вставляется в a NOT NULL
столбец.
Вместо этого оператор перестал работать с ошибкой.)
Установка числового столбца к значению, которое находится вне диапазона столбца. Значение отсекается к самой близкой конечной точке диапазона.
Присвоение значения такой как '10.34 a'
к числовому
столбцу. Запаздывающий нечисловой текст является неизолированным, и остающаяся числовая часть
вставляется. Если у строкового значения нет никакой ведущей числовой части, столбец устанавливается в
0
.
Вставка строки в строковый столбец (CHAR
, VARCHAR
, TEXT
, или BLOB
) это превышает максимальную длину столбца. Значение является
усеченным к максимальной длине столбца.
Вставка значения в дату или столбец времени, который недопустим для типа данных. Столбец устанавливается в соответствующее нулевое значение для типа.
Если Вы используете API C, информационная строка может быть получена, вызывая mysql_info()
функция. См. Раздел 22.8.7.35,"mysql_info()
".
Если INSERT
вставляет строку в таблицу, которая имеет AUTO_INCREMENT
столбец, можно счесть значение используемым для того столбца при использовании SQL LAST_INSERT_ID()
функция. Изнутри API C используйте mysql_insert_id()
функция. Однако, следует отметить, что две функции не
всегда ведут себя тождественно. Поведение INSERT
операторы относительно AUTO_INCREMENT
столбцы обсуждаются далее в Разделе 12.14, "информационные Функции",
и Раздел
22.8.7.37,"mysql_insert_id()
".
INSERT
оператор поддерживает следующие модификаторы:
Если Вы используете DELAYED
ключевое слово, сервер
помещает строку или строки, которые будут вставлены в буфер, и клиент, выходящий INSERT DELAYED
оператор может тогда сразу продолжаться. Если таблица
используется, сервер содержит строки. Когда таблица свободна, сервер начинает вставлять строки, проверяя
периодически, чтобы видеть, есть ли какие-либо новые запросы чтения на таблицу. Если есть, задержанная
очередь строки временно отстраняется, пока таблица не становится свободной снова. См. Раздел
13.2.5.2,"INSERT DELAYED
Синтаксис".
DELAYED
игнорируется с INSERT ... SELECT
или INSERT ... ON DUPLICATE KEY UPDATE
.
DELAYED
также игнорируется для INSERT
это использует функции, получающие доступ к таблицам или
триггерам, или это вызывают от функции или триггера.
С MySQL 5.6.6, INSERT
DELAYED
осуждается, и будет удален в будущем выпуске. Использовать INSERT
(без DELAYED
) вместо этого.
Если Вы используете LOW_PRIORITY
ключевое слово,
выполнение INSERT
задерживается, пока никакие другие клиенты не читают из
таблицы. Это включает другие клиенты, которые начали читать, в то время как существующие клиенты читают,
и в то время как INSERT LOW_PRIORITY
оператор ожидает. Это возможно,
поэтому, для клиента, который выходит INSERT LOW_PRIORITY
оператор, чтобы
ожидать в течение очень долгого времени (или даже навсегда) в нагруженной чтением среде. (Это в отличие
от INSERT DELAYED
, который позволяет клиенту продолжать сразу.) Отмечают
это LOW_PRIORITY
не должен обычно использоваться с MyISAM
таблицы, потому что выполнение так отключает параллельные вставки. См. Раздел
8.10.3, "Параллельные Вставки".
Если Вы определяете HIGH_PRIORITY
, это переопределяет эффект --low-priority-updates
опция, если сервер был запущен с той опции. Это
также заставляет параллельные вставки не использоваться. См. Раздел
8.10.3, "Параллельные Вставки".
LOW_PRIORITY
и HIGH_PRIORITY
влияйте только
на механизмы хранения, которые используют только блокировку на уровне таблицы (такой как MyISAM
, MEMORY
, и MERGE
).
Если Вы используете IGNORE
ключевое слово, ошибки,
которые происходят, выполняясь INSERT
оператор обрабатывается как предупреждения вместо этого. Например, без IGNORE
, строка, которая копирует существующее UNIQUE
индексируйте или PRIMARY KEY
значение в таблице вызывает двойную ключевую
ошибку, и оператор прерывается. С IGNORE
, строка все еще не вставляется, но
никакая ошибка не выпускается.
IGNORE
имеет подобный
эффект на вставки в разделенные таблицы, где никакой раздел, соответствующий данное значение, не
находится. Без IGNORE
, такой INSERT
операторы прерываются с ошибкой; однако, когда INSERT IGNORE
используется, работа вставки перестала работать
тихо для строки, содержащей несогласованное значение, но любые строки, которые являются
соответствующими, вставляются. Для примера см. Раздел 18.2.2,"LIST
Разделение".
Преобразования данных, которые инициировали бы ошибки, прерывают оператор если IGNORE
не определяется. С IGNORE
,
недопустимые значения корректируются к самым близким значениям и вставляются; предупреждения
производятся, но оператор не прерывается. Можно определить с mysql_info()
C API-функция, сколько строк было фактически
вставлено в таблицу.
Если Вы определяете ON DUPLICATE KEY UPDATE
, и строка
вставляется, который вызвал бы двойное значение в a UNIQUE
индексируйте или
PRIMARY KEY
, UPDATE
из старой строки выполняется. Значение влиявших строк на
строку 1, если строка вставляется как новая строка, 2, если существующая строка обновляется, и 0, если
существующая строка устанавливается в ее текущую стоимость. Если Вы определяете CLIENT_FOUND_ROWS
флаг к mysql_real_connect()
соединяясь с mysqld, значение влиявших строк 1 (не 0), если
существующая строка устанавливается в ее текущую стоимость. См. Раздел
13.2.5.3,"INSERT ... ON DUPLICATE KEY UPDATE
Синтаксис".
Вставка в таблицу требует INSERT
полномочие для таблицы. Если ON DUPLICATE KEY
UPDATE
пункт используется, и двойной ключ вызывает UPDATE
чтобы быть выполненным вместо этого, оператор требует UPDATE
полномочие для столбцов, которые будут обновлены. Для столбцов, которые
читаются, но не изменили Вас, нуждаются только SELECT
полномочие (такой что касается столбца, на который ссылаются только на
правой стороне col_name
=expr
присвоение в ON DUPLICATE KEY UPDATE
пункт).
До MySQL 5.6.6, INSERT
это влияло на разделенную таблицу, используя механизм
хранения такой как MyISAM
это
использует блокировки на уровне таблицы, заблокированные все разделы таблицы. Это было истиной даже для INSERT ... PARTITION
операторы. (Это не сделало и не происходит с механизмами
хранения такой как InnoDB
та работа
блокировка на уровне строки.) В MySQL 5.6.6 и позже, MySQL использует сокращение блокировки раздела, так, чтобы
только разделы, в которые вставляются строки, были фактически заблокированы. Для получения дополнительной
информации см. Раздел 18.6.4, "Деля и Блокируя".