根据link
在SQL中使用主键(student_id
)创建表,如下所示:
CREATE TABLE students(student_id CHAR(4) NOT NULL,
lastname CHAR(15), firstname CHAR(15), PRIMARY KEY(student_id));
在Berkeley DB中,我们可以使用以下代码执行此操作:
struct student_record {
char student_id[4];
char last_name[15];
char first_name[15];
};
DB *dbp, *sdbp;
int ret;
/* Open/create primary */
if ((ret = db_create(&dbp, dbenv, 0)) != 0)
handle_error();
if ((ret = dbp->open(dbp,
"students.db", NULL, DB_BTREE, DB_CREATE, 0600)) != 0)
handle_error();
从应用程序的角度来看,将数据放入数据库与没有二级索引的情况完全相同;可以简单地将记录插入主数据库。在SQL中,可以执行以下操作:
INSERT INTO student
VALUES ("WC42", "Churchill ", "Winston ");
在Berkeley DB中,人们会这样做:
struct student_record s;
DBT data, key;
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
memset(&s, 0, sizeof(struct student_record));
key.data = "WC42";
key.size = 4;
memcpy(&s.student_id, "WC42", sizeof(s.student_id));
memcpy(&s.last_name, "Churchill ", sizeof(s.last_name));
memcpy(&s.first_name, "Winston ", sizeof(s.first_name));
data.data = &s;
data.size = sizeof(s);
if ((ret = dbp->put(dbp, txn, &key, &data, 0)) != 0)
handle_error(ret);
我的问题:
我们拨打student_id
时是否设置了主键(db_create()
)?如果否,基于student_id
字段的行如何唯一?
答案 0 :(得分:0)
您必须阅读整个页面,而不仅仅是前几行。
进一步探索设置键的方式。它与db_create()
无关,{{1}}甚至没有定义任何“表”结构;事实上,正如你在休息室所说的那样,伯克利数据库是非关系型的,没有这样的概念。相反,键是每行“手动”设置的。如果您愿意,您可以将密钥基于学生ID,但不会自动发生。