4

我对 SQL Server 比较陌生(如果我记得的话,我在 1980 年代后期确实学习过 SQL,DB2)今天我将我的数据库层集成到 SQL 中,首先是 SQL Server。

首先。正如我今天所做的那样,我将在运行时以编程方式生成每个数据库对象、表对象和索引,就像我对项目中几乎每个视觉对象和数据对象所做的那样。也就是说,我使用的视觉设计工具非常有限。

我项目中的每一列都有一个外部描述文件(每个用户都有包含这些文件的配置文件),就像我对数据库键和视觉对象的定位、长度、图片掩码、字体大小等一样. 即动态形式。几乎每个窗口、网格、过滤器都是在运行时创建的,就像我的大多数数据库连接一样。

我确实构建了一个小型测试“机器”来在这个环境中创建表并且做得很好,很容易在程序中创建表(我使用 delphi 和 ADO)

我遇到的问题是,当我将列标记为“自动增量”或Identity在 SQL Server 中,或者如果我将列描述为主键时,SQL Server Management Studio 会自动创建索引或键。

如果我可以管理它赋予此索引或键的名称,那就没问题了。

这种情况的例子:

    AdoCommand.CommandText := Str_SQL;
    TRY
      AdoCommand.Execute;
    FINALLY
      NotiFy_TimeOut ('Table was created', wait_for_one_sec);
    END;

我的数据库引擎创建了这个 SQL 脚本,我将它传递到上面的字符串中Str_SQL

    CREATE TABLE GENGITFL 
    (
      NR INT NOT NULL IDENTITY,
      GJM CHAR(3) NOT NULL,
      HEITI VARCHAR(25) NOT NULL,
      KAUPG REAL NULL,
      SOLUG REAL NULL,
      TOLLG REAL NULL,
      DUMMY VARCHAR(20) NULL,
    UNIQUE (GJM),
    PRIMARY KEY (GJM)
    )

SQL Server 自动创建这两个索引:

  • PK__GENGITFL__C51F17260A463F49
  • UQ__GENGITFL__C51F17277FA3E6E6

我不想为这些文件使用这些名称,我更喜欢以下名称:

  • IDX_GENGITFL_GJM
  • IDX_GENGITFL_NR

根据我的介绍,原因应该很明显,运行时引擎无法自动创建这些名称,我认为在系统数据库中查找哪些索引文件不是一个选项。如果我的外部描述说应该有索引,我只想通过使用前缀自动为索引创建名称,IDX_然后是表名,最后是字段名称或名称之间的下划线,IDX_GENGITFL_GJM等等。

希望有人能理解我糟糕的英语和演讲。我的英语相当生疏。

谢谢

编辑:在 marc_s 的帮助下,我的 SQL“脚本”是这样的:

    CREATE TABLE GENGITFL 
    (
      NR INT NOT NULL IDENTITY,
      GJM CHAR(3) NOT NULL,
      HEITI VARCHAR(25) NOT NULL,
      KAUPG REAL NULL,
      SOLUG REAL NULL,
      TOLLG REAL NULL,
      DUMMY VARCHAR(20) NULL,
    CONSTRAINT IDX_GENGITFL_NR UNIQUE (NR),
    CONSTRAINT IDX_GENGITFL_GJM PRIMARY KEY (GJM),
    )

    CREATE INDEX IDX_GENGITFL_HEITI ON GENGITFL (HEITI)

再次感谢。

4

1 回答 1

11

如果您不想要系统默认名称 - 只需指定您自己的名称!

 CREATE TABLE GENGITFL 
    (
      NR INT NOT NULL IDENTITY,
      GJM CHAR(3) NOT NULL,
      HEITI VARCHAR(25) NOT NULL,
      KAUPG REAL NULL,
      SOLUG REAL NULL,
      TOLLG REAL NULL,
      DUMMY VARCHAR(20) NULL,
    CONSTRAINT IDX_GENGITFL_NR UNIQUE (GJM),
    CONSTRAINT IDX_GENGITFL_GJM PRIMARY KEY (GJM)
    )

看到 和之前CONSTRAINT (yourownnamehere)的那些?UNIQUEPRIMARY KEY

现在,您的约束按照定义的方式命名。

于 2012-12-01T09:46:55.260 回答