Отвечая на связанный вопрос ( SELECT * EXCEPT ), я указываю на действительно реляционный язык Учебное пособие D позволяет вместо проекции быть выраженной через атрибуты, которые будут удаленыиз них должны быть сохранены, например,
my_relvar { ALL BUT description }
Однако его синтаксис INSERT
требует, чтобы конструкторы значений кортежей включали пары имя / значение атрибута, например
INSERT P
RELATION
{
TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) },
TUPLE { PNO PNO ( 'P2' ) , PNAME CHARACTER ( 'Bolt' ) }
};
Конечно, использование этого синтаксисаэто не порядок столбцов (потому что он действительно реляционный!), например, это семантически эквивалентно:
INSERT P
RELATION
{
TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) },
TUPLE { PNAME CHARACTER ( 'Bolt' ) , PNO PNO ( 'P2' ) }
};
Альтернативой будет полностью полагаться на упорядочение атрибутов, что частично делает SQL, например, это близкий к SQL эквивалентвышеупомянутое:
INSERT INTO P ( PNO , PNAME )
VALUES
( PNO ( 'P1' ) , CAST ( 'Nut' AS VARCHAR ( 20 ) ) ) ,
( PNO ( 'P2' ) , CAST ( 'Bolt' AS VARCHAR ( 20 ) ) );
Как только комманист столбцов определен, конструкторы строк VALUES
сохраняют этот порядок, что не является идеальным.Но, по крайней мере, порядок указан: ваше предложение будет опираться на некоторый порядок по умолчанию, который может быть недетерминированным.