Как использовать DDL для изменения свойства «Обязательно» столбца в Access? - PullRequest
3 голосов
/ 30 июля 2009

В таблице доступа у меня есть столбец, у которого свойство «Required» установлено в «True». Мне нужен запрос, который изменил бы его на «Ложь». Я безуспешно пробовал следующее:

ALTER TABLE [MyTbl] ALTER COLUMN [MyCol] VARCHAR(30) NULL;

Ответы [ 6 ]

6 голосов
/ 01 августа 2009

Доступ (Jet / ACE) DDL позволит вам изменить свойство поля Required с False на True. Вот пример в окне «Доступ к немедленному доступу»:

? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required
False
CurrentDb.Execute "ALTER TABLE [MyTbl] ALTER COLUMN [MyCol] VARCHAR(30) NOT NULL;"
? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required
True

Тем не менее, вы хотите наоборот - изменить Required с True на False. Access DDL этого не сделает. В этом примере применяется запрошенный размер поля, но свойство Required не изменяется. И Access не выдает ошибку:

CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required = True
? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required
True
? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Size
 10 
CurrentDb.Execute "ALTER TABLE [MyTbl] ALTER COLUMN [MyCol] VARCHAR(30) NULL;"
? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required
True
? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Size
 30 

И если вы исключите любое упоминание Null в выражении DDL, Required по-прежнему не изменится:

CurrentDb.Execute "ALTER TABLE [MyTbl] ALTER COLUMN [MyCol] VARCHAR(30);"
? CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required
True

В качестве альтернативы вы можете использовать сочетание Access DDL и DML, как продемонстрировали @tschaible и @hawbsl. Однако такой подход кажется мне слишком большим усилием. Я бы предпочел подход, предложенный @Caltor. Если это практично для вас, это может быть даже так просто, как это ...

CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required = False
5 голосов
/ 30 июля 2009

Jet SQL, базовый движок SQL в Access, не позволяет изменять свойство null для столбцов. Чтобы сделать это, нужно:

  1. Создайте новый временный столбец (B), который допускает нулевые значения.
  2. Скопируйте данные из старого столбца (A) в новый столбец (B).
  3. Бросьте старую колонну (A).
  4. Создайте новый столбец (C) с тем же именем, что и старый столбец (A). Убедитесь, что новый столбец (C) имеет правильное нулевое ограничение.
  5. Скопируйте данные обратно из временного нового столбца (B) во вновь добавленный столбец (C).
  6. Столбец снижения B.
2 голосов
/ 10 января 2013

Если вы программируете в Access, вы можете использовать следующий код VBA:

Dim db As Database
Dim tbl As TableDef

Set db = OpenDatabase("MyDB.mdb", True) '' Open for Exclusive access
Set tbl = db.TableDefs("MyTbl")
tbl.Fields("MyCol").Required = False

'' Cleanup
Set tbl = Nothing
db.Close
Set db = Nothing
1 голос
/ 03 февраля 2014

@ Ответ Хансупа верен, поэтому при использовании чистого DDL единственным решением является ответ @sschaible.

Для полноты и добавления к ответу @ tschaible (и в качестве примечания к себе) вот полный DDL. Замените в своем поле имя и тип данных.

Пример предполагает Person таблицу с полем BirthDate, которую мы теперь хотим сделать необязательной:

ALTER TABLE Person ADD COLUMN BirthDate2 DATE;
UPDATE Person SET BirthDate2=BirthDate;
ALTER TABLE Person DROP COLUMN BirthDate;
ALTER TABLE Person ADD COLUMN BirthDate DATE;
UPDATE Person SET BirthDate=BirthDate2;
ALTER TABLE Person DROP COLUMN BirthDate2;
1 голос
/ 30 июля 2009

Я почти уверен, что приведенный выше ответ на вопрос tschaibles является ПОЛНОСТЬЮ НЕПРАВИЛЬНЫМ. Это правда, что вы не можете изменить обязательное свойство с помощью механизма запросов. Но я почти уверен, что вы можете изменить это с помощью VBA.

Ваш вопрос сбивает с толку ... не могли бы вы уточнить несколько вещей.

Хотите ли вы навсегда изменить требуемое свойство. Если это так, вы можете изменить это свойство в дизайнере таблиц в любое время.

Хотите изменить свойство при определенных условиях во время выполнения? Что-то вроде «Сменить свойство», «Сделать что-то», «Сменить его обратно». В этом случае вы не можете использовать механизм запросов для этого, но я почти уверен, что вы можете сделать это через VBA. Так что это может быть сделано. Большинство, если не все, что можно сделать с помощью пользовательского интерфейса, можно выполнить с помощью кода VBA.

Если вы хотите сделать это во время выполнения, но вы просто используете файл Access в качестве хранилища данных приложения .net (используя поставщика OleDB для ado.net), у вас есть проблема. Я бы порекомендовал вам использовать другой поставщик данных (например, vistaDB). Можете ли вы предоставить некоторые детали, тогда я мог бы немного покопаться и дать вам более подробный ответ.

Сет

0 голосов
/ 30 июля 2009

Попробуйте ссылаться на ADOX в вашем приложении (.NET?). ADOX В объекте Table вы можете установить для атрибута значение Nullable (вам придется взглянуть на новые соглашения в .NET по сравнению с VB 6, который обрабатывал это подобно VBA).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...