Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果I';我也把它用作FK_Sql_Sql Server_Database - Fatal编程技术网

Sql 如果I';我也把它用作FK

Sql 如果I';我也把它用作FK,sql,sql-server,database,Sql,Sql Server,Database,我有这样的想法: create table account ( id int identity(1,1) primary key, usertype char(1) check(usertype in ('a', 'b')) not null, unique(id, usertype) ) create table auser ( id int primary key, userty

我有这样的想法:

    create table account
    (
       id int identity(1,1) primary key,
       usertype char(1) check(usertype in ('a', 'b')) not null, 
       unique(id, usertype)
    )

    create table auser
    (
       id int primary key,
       usertype char(1) check(usertype = 'a') not null, 
       foreign key (id, usertype) references account(id, usertype)
    )

    create table buser
    (
    ... same just with b
    )

问题是:如果我要使用int而不是char(1),它是否会工作得更快/更好?

在大多数现代数据库中这并不重要。int很好

查尔也是


(当数据库从表中获取数据时,它不是以字节大小表示的…)

这在大多数现代数据库中并不重要。int很好

查尔也是


(当数据库从表中获取数据时,它不是字节大小的…)

为什么需要标识列:“auser.id”和“buser.id”将外键返回到“account.id”标识列??似乎很难确保一切都能同步?当你插入账户时,你会得到一个ID(比如1)并输入“a”,当你插入“auser”时,你会得到一个ID(1)和FK到“account”中,你会如何插入“buser”(并获得ID 1)和FK到账户1,b


真正的问题。将UserType的大小设置为将有多少个值,如果只有几个字符(1)是最好的,那么索引将占用更少的内存。如果您的字符数超过一个字符(1)所能容纳的字符数,请输入极小的int(0-255,1字节),如果您需要更多的字符数,请输入极小的int(32k,2字节),如果您需要更多的go int(2147483647,4字节)

为什么需要标识列:“auser.id”和“buser.id”,将外键返回到“account.id”标识列??似乎很难确保一切都能同步?当你插入账户时,你会得到一个ID(比如1)并输入“a”,当你插入“auser”时,你会得到一个ID(1)和FK到“account”中,你会如何插入“buser”(并获得ID 1)和FK到账户1,b


真正的问题。将UserType的大小设置为将有多少个值,如果只有几个字符(1)是最好的,那么索引将占用更少的内存。如果你有超过一个字符(1)所能容纳的数量,则使用小整数(0-255,1字节),如果你需要更多,则使用小整数(32k,2字节),如果你需要更多的字符(2147483647,4字节)

字符(1)是1字节,而整数是4字节。即使是一个小的int也是2字节。

字符(1)是1字节,而int是4字节。即使是一个小整数也是2字节。

以下是您问题的答案:在链接中的示例中,没有提到标识/自动增量列。除非从“usera”和“userb”表中删除标识,否则您的示例将不起作用。仅在帐户中生成标识值,仅在“usera”和“userb”中使用,不要在那里生成(“usera”和“userb”)。是的,很抱歉,我在usera/b表中没有标识,我已编辑了我的问题顺便说一句,我认为您在此处显示的是bigint,int要小得多:)下面是您问题的答案:在链接中的示例中,没有提到标识/自动增量列。除非从“usera”和“userb”表中删除标识,否则您的示例将不起作用。只在帐户中生成标识值,只在“usera”和“userb”中使用它,不要在那里生成(“usera”和“userb”)。是的,很抱歉,我在usera/b表中没有标识,我编辑了我的问题BTW,我认为这里显示的是bigint,int要小得多:)如果你进入多行数据,如果CHAR(1)足够的话,您将在索引上浪费内存,并且使用INT可以减少每页的行数,这将产生效果。最好为列选择最佳大小。这是一种问题,如果你懒惰5分钟,可能会导致计算机资源的浪费。如果你进入多行数据,你将浪费索引上的内存,如果CHAR(1)足够,则使用INT每页获得的行数会更少,这将产生影响。最好为列选择最佳大小。这是一种问题,如果你懒惰5分钟,可能会浪费一生的计算机资源。你真的有两个同名的表吗?努普,当然没有,我只是展示了基本思想你真的有两个同名的表吗?努普,当然没有,我只是展示了基本思想