При написании DDL на SQL вы можете указать пару ограничений для столбцов, например, ограничения NOT NULL или DEFAULT . Некоторые люди могут задаться вопросом, являются ли эти два ограничения на самом деле избыточными , то есть все еще необходимо указывать ограничение NOT NULL , если уже есть предложение DEFAULT ?
Ответ: да!
Да, вы все равно должны указать, что ограничение NOT NULL . И нет, эти два ограничения не являются избыточными. Ответ, который я дал здесь о переполнении стека, завершает его примером, который я собираюсь повторить здесь, в нашем блоге:
DEFAULT— это значение, которое будет вставлено при отсутствии явного значения в операторе вставки / обновления. Предположим, у вашего DDL не было ограниченияNOT NULL:
123ALTERTABLEtblADDCOLUMNcolVARCHAR(20)DEFAULT"MyDefault"Тогда вы могли бы выдать эти заявления
01020304050607080910111213141516171819-- 1. This will insert "MyDefault"-- into tbl.colINSERTINTOtbl (A, B)VALUES(NULL,NULL);-- 2. This will insert "MyDefault"-- into tbl.colINSERTINTOtbl (A, B, col)VALUES(NULL,NULL,DEFAULT);-- 3. This will insert "MyDefault"-- into tbl.colINSERTINTOtbl (A, B, col)DEFAULTVALUES;-- 4. This will insert NULL-- into tbl.colINSERTINTOtbl (A, B, col)VALUES(NULL,NULL,NULL);Кроме того, вы также можете использовать DEFAULT в инструкциях UPDATE в соответствии со стандартом SQL-1992:
1234567-- 5. This will update "MyDefault"-- into tbl.colUPDATEtblSETcol =DEFAULT;-- 6. This will update NULL-- into tbl.colUPDATEtblSETcol =NULL;Обратите внимание, что не все базы данных поддерживают все эти стандартные синтаксисы SQL. Добавление ограничения NOT NULL приведет к ошибке с операторами 4, 6, в то время как 1-3, 5 по-прежнему являются действительными операторами. Итак, чтобы ответить на ваш вопрос:
Нет, NOT NULL и DEFAULT не являются избыточными
Это уже довольно интересно, поэтому ограничение DEFAULT действительно взаимодействует только с операторами DML и тем, как они определяют различные обновляемые столбцы. Ограничение NOT NULL является гораздо более универсальной гарантией, которая ограничивает содержимое столбца также «вне» манипулирующих операторов DML.
Например, если у вас есть набор данных, а затем вы добавляете ограничение DEFAULT , это не повлияет на ваши существующие данные, будут вставлены только новые данные.
Однако, если у вас есть набор данных, а затем вы добавляете ограничение NOT NULL , вы можете сделать это только в том случае, если ограничение действительно — т.е. когда в вашем столбце нет значений NULL . В противном случае возникнет ошибка.
Запрос производительности
Еще один очень интересный вариант использования, который применяется только к ограничениям NOT NULL — это их полезность для оптимизаторов запросов и планов выполнения запросов. Предположим, что у вас есть такое ограничение на ваш столбец, а затем вы используете предикат NOT IN :
|
1
2
3
4
5
6
|
SELECT *FROM tableWHERE value NOT IN ( SELECT not_nullable FROM other_table) |
В частности, когда вы используете Oracle, вышеуказанный запрос будет выполняться намного быстрее, если столбец not_nullable имеет индекс И это конкретное ограничение, потому что, к сожалению, значения NULL не включены в индексы Oracle .
Узнайте больше о предикатах NULL и NOT IN здесь .
| Ссылка: | Задумывались ли вы когда-нибудь о разнице между NOT NULL и DEFAULT? от нашего партнера JCG Лукаса Эдера в блоге JAVA, SQL и JOOQ . |