Несмотря на то, что последовательности представляют собой эквивалент для MySQL auto_increment, существуют некоторые тонкие, но важные отличия:
Серийный столбец увеличивается при неудачных запросах. Это приводит к фрагментации из неудавшихся запросов, а не к удалению строк. Например, запустите следующие запросы в базе данных PostgreSQL:
CREATE TABLE table1 (
uid serial NOT NULL PRIMARY KEY,
col_b integer NOT NULL,
CHECK (col_b>=0)
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
SELECT * FROM table1;
Вы должны получить следующий вывод:
uid | col_b
-----+-------
1 | 1
3 | 2
(2 rows)
Обратите внимание, что uid переходит от 1 до 3 вместо 1 на 2.
Это все еще происходит, если вы должны вручную создать свою собственную последовательность с помощью:
CREATE SEQUENCE table1_seq;
CREATE TABLE table1 (
col_a smallint NOT NULL DEFAULT nextval('table1_seq'),
col_b integer NOT NULL,
CHECK (col_b>=0)
);
ALTER SEQUENCE table1_seq OWNED BY table1.col_a;
Если вы хотите проверить, как MySQL отличается, запустите следующее в MySQL база данных:
CREATE TABLE table1 (
uid int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
col_b int unsigned NOT NULL
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
Вы должны получить следующее без обжатия:
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
+-----+-------+
2 rows in set (0.00 sec)
Это было указано в предыдущем ответе @trev.
Чтобы имитировать это вручную, установите uid равным 4, который будет
INSERT INTO table1 (uid, col_b) VALUES(5, 5);
Данные таблицы:
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
(3 rows)
Запустите еще одну вставку:
INSERT INTO table1 (col_b) VALUES(6);
Данные таблицы:
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
4 | 6
Теперь, если вы запустите другую вставку:
INSERT INTO table1 (col_b) VALUES(7);
Не удалось выполнить следующее сообщение об ошибке:
ОШИБКА: дублирующее значение ключа нарушает уникальное ограничение " table1_pkey "DETAIL: Key (uid) = (5) уже существует.
blockquote>Напротив, MySQL будет обрабатывать это изящно, как показано ниже:
INSERT INTO table1 (uid, col_b) VALUES(4, 4);
Теперь вставьте другая строка без установки uid
INSERT INTO table1 (col_b) VALUES(3);
Запрос не сбой, uid просто переходит на 5:
+-----+-------+ | uid | col_b | +-----+-------+ | 1 | 1 | | 2 | 2 | | 4 | 4 | | 5 | 3 | +-----+-------+
Тестирование выполнялось на MySQL 5.6.33, для Linux ( x86_64) и PostgreSQL 9.4.9
На самом деле это не ответ на ваш вопрос, но только в этой части:
[3] требует и идентификатора, и имени ... имея и то, и другое несколько избыточно
Скорее всего, вам все равно понадобится атрибут id
в каждом поле формы, чтобы вы могли связать с ним его элемент
, вот так:
<label for="foo">Foo:</label>
<input type="text" name="foo" id="foo" />
Это требуется для доступности (например, если вы не связываете метки формы и элементы управления, почему вы так ненавидите слепых?).
Это в некоторой степени избыточно, хотя и в меньшей степени, когда у вас есть флажки / переключатели, когда некоторые из них могут иметь общее имя
. В конечном счете, id
и name
предназначены для разных целей, даже если оба часто имеют одно и то же значение.
[1] document.forms [0] .elements [0];
На ум приходит « No-omg-never! » когда я вижу этот метод доступа к элементам. Проблема заключается в том, что он предполагает, что DOM представляет собой нормальную структуру данных (например, массив), в которой порядок элементов статичен, согласован или надежен в любом случае. Мы знаем, что в 99,9999% случаев это не так. Изменение порядка или ввода
элементов внутри формы, добавление другой формы
на страницу перед рассматриваемой формой или перемещение рассматриваемой формы - все это случаи, когда этот код ломается. Краткая история: это очень хрупко. Как только вы что-то добавите или переместите, это сломается.
[2] document.myForm.foo;
Я с Сергеем Илинским по этому вопросу:
id
: документ .getElementById ("myform");
document.getElementById ("myform"). foo;
Моя основная проблема с этим методом заключается в том, что атрибут name
бесполезен при применении к форме. Имя не передается на сервер как часть POST / GET и не работает для закладок в стиле хеширования.
[3] document.getElementById ('foo');
На мой взгляд, это наиболее предпочтительный метод.Прямой доступ - самый лаконичный и понятный метод.
[4] document.getElementById ('myForm'). Foo;
На мой взгляд, это приемлемо, но более подробное, чем необходимо. Метод №3 предпочтительнее.
Мне так случилось, что я смотрел видео Дугласа Крокфорда , и он взвешивал именно эту тему. Достопримечательность находится в -12: 00. Подводя итог:
name
используется для именования вещей, а не для доступа к ним. Он предназначен для именования таких вещей, как окна, поля ввода и теги привязки. у тебя есть это. С семантической точки зрения это наиболее разумно.
Форма 2 в порядке, и форма 3 также рекомендуется.
Избыточность между name и id вызвана необходимостью сохранения совместимости, на html 5 некоторые элементы (как img, form, iframe и т.д.) потеряют свой атрибут "name", и рекомендуется использовать только их id для ссылки на них с этого момента :)
Посетите эту страницу: https://developer.mozilla.org/En/DOM/Document.getElementsByName
document.getElementsByName('foo')[0]; // returns you element.
Он должен быть «элементами» и должен возвращать массив, потому что более одного элемента могут иметь одно и то же имя.
Для доступа к именованным элементам, размещенным в формы, рекомендуется использовать сам объект form
.
Чтобы получить доступ к произвольному элементу в дереве DOM, который иногда может быть найден в форме, используйте getElementById
и идентификатор элемента id
.