如何使用DDL更改Access中列的"必需"属性?

Tih*_*uan 3 sql ms-access

在访问表中,我有一个"Required"属性设置为"True"的列.我需要一个查询,将其更改为"False".我尝试了以下但没有成功:

ALTER TABLE [MyTbl] ALTER COLUMN [MyCol] VARCHAR(30) NULL;
Run Code Online (Sandbox Code Playgroud)

Han*_*sUp 6

Access(Jet/ACE)DDL允许您将字段的Required属性从False 更改为True.以下是Access Immediate窗口中的示例:

? 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
Run Code Online (Sandbox Code Playgroud)

但是,你想要相反的--- Required从True变为False.访问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 
Run Code Online (Sandbox Code Playgroud)

如果在DDL语句中排除任何Null的提及,Required仍然保持不变:

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

作为替代方案,您可以使用Access DDL和DML的混合作为@tschaible和@hawbsl演示.然而,这种方法对我来说似乎太费劲了.我更喜欢@Caltor建议的方法.如果这对你来说很实用,它甚至可能就这么简单......

CurrentDb.TableDefs("MyTbl").Fields("MyCol").Required = False
Run Code Online (Sandbox Code Playgroud)


tsc*_*ble 5

Jet SQL,Access中的底层SQL引擎不允许您修改列上的null属性.这样做的工作是:

  1. 创建一个允许空值的新临时列(B).
  2. 将数据从旧列(A)复制到新列(B).
  3. 放下旧栏(A).
  4. 创建一个与旧列(A)同名的新列(C).确保新列(C)具有正确的空约束.
  5. 将数据从临时新列(B)复制回新添加的列(C).
  6. 删除列B.