我有一个具有强制自动增量列的表,此列是一个非常有价值的ID,可以在整个应用程序中保留.很抱歉,我认为这是一个自动增量列的开发很差.
所以,这是问题所在.我必须在此表中插入已经创建并从表中删除的列的ID.有点像复活这个ID并把它放回到表中.
那么如何以编程方式执行此操作而不关闭列增量.如果我错了,请纠正我,如果我以编程方式将其关闭,它将在0或1重新开始,我不希望发生这种情况......
目前我们正在对30多个表数据库中的所有自动增量id列使用INT(21)*.
我们是一个博客网站,并有表格存储成员,评论,博客文章等.
我很确定我们永远不会达到我们的INT(21)id列的限制,并且想知道:
*不是我的设计.我问这个是因为我正在考虑减少这个,说INT(10).
我正在研究提出数据库行主键的这三种主要方法的优缺点.
因此,假设我使用的数据库支持多种方法,是否有一个简单的启发式方法来确定最适合我的选项?
如何考虑这样的分布式/多主机,性能要求,ORM使用,安全性和测试?
一个人可能遇到的任何意想不到的缺点?
我试图从一个表插入另一个表使用
DECLARE @IDOffset int;
SELECT @IDOffset = MAX(ISNULL(ID,0)) FROM TargetTable
INSERT INTO TargetTable(ID, FIELD)
SELECT [Increment] + @IDOffset ,FeildValue
FROM SourceTable
WHERE [somecondition]
Run Code Online (Sandbox Code Playgroud)
TargetTable.ID不是标识列,这就是为什么我必须找到一种自己增加它的方法.
我知道我可以使用游标,或者创建一个带有标识列和FieldValue字段的表变量,填充它,然后在我的中使用它insert into...select,但这不是很有效.我尝试使用ROW_NUMBER函数来递增,但我在SourceTable中确实没有合法的ORDER BY字段可以使用,并且希望保留SourceTable的原始顺序(如果可能).
谁能提出任何建议?
使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.
CREATE TABLE Staff (
ID INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)
错误:
Run Code Online (Sandbox Code Playgroud)********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
知道为什么吗?
我的目标是在表中插入新行时自动插入主键字段.
如何在PostgreSQL中获得从一个会话到另一个会话的序列?
doubleemploi@hanbei:/home/yves$ psql -d test
Mot de passe :
psql (8.4.13)
Saisissez « help » pour l''aide.
test=> create sequence test001 start 10;
CREATE SEQUENCE
test=> select currval('test001');
ERREUR: la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session
--- current value not yet defined this session (???)
test=> select setval('test001', 10);
setval
--------
10
(1 ligne)
test=> select currval('test00');
currval
---------
10
(1 ligne)
test=> \q
test@hanbei:/home/yves$ psql -d test
Mot …Run Code Online (Sandbox Code Playgroud) 我需要一个特定的类来包含一个静态成员,该成员每次实例化该类的一个实例时都会跟踪,实质上是这样每个类的实例都有一个唯一的索引.它适用于非泛型类,但只要类型T在实例之间不同,这种通用实现就会失败:
class A<T>
{
private static int counter;
private static int Counter {
get {
Increment();
return counter;
}
}
private static void Increment() {
counter++;
}
public int Index;
public A()
{
this.Index = Counter; // using A<T>.Counter makes no difference
Console.WriteLine(this.Index);
}
}
class Program
{
static void Main(string[] args)
{
var a = new A<string>();
var b = new A<string>();
var c = new A<string>();
var d = new A<int>();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
1
2
3
1 …
现在,我有一个表,其主键是一个auto_increment字段.但是,我需要将主键设置为username,date(以确保不能存在具有日期的重复用户名).
auto_increment但是,我需要该字段才能更改行信息(添加和删除).
通常在这种情况下做什么?
谢谢!
这是MySQL 5.3.X + db中的一个表:
CREATE TABLE members` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`memberid` VARCHAR( 30 ) NOT NULL ,
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`firstname` VARCHAR( 50 ) NULL ,
`lastname` VARCHAR( 50 ) NULL ,
UNIQUE (memberid),
PRIMARY KEY (id)
) ENGINE = MYISAM;
Run Code Online (Sandbox Code Playgroud)
Id列从不在查询中使用,它只是为了方便视觉(因此很容易看到表的增长方式).Memberid是一个实际的键,是唯一的,并且在查询中使用memberid来标识任何成员(WHERE memberid ='abcde').
我的问题是:如何保持auto_increment,但将memberid作为主键?那可能吗?当我尝试使用PRIMARY KEY(memberid)创建此表时,出现错误:
1075 - 表定义不正确; 只能有一个自动列,必须将其定义为键
什么是最佳选择(希望有一种方法可以保持id列,以便性能良好,查询通过memberid识别任何用户,而不是id),如果性能非常重要(尽管磁盘空间不是)?
由于CouchDB不支持SQL类似的AUTO_INCREMENT,您的方法是为文档生成顺序唯一数字ID?
编辑:
我需要数字ID有几个原因:
我知道复制等问题.这就是为什么我对人们如何克服这个问题感兴趣.
auto-increment ×10
mysql ×3
primary-key ×3
sql ×3
postgresql ×2
sql-server ×2
.net ×1
c# ×1
couchdb ×1
database ×1
generics ×1
sequence ×1
static ×1
t-sql ×1
types ×1
uuid ×1