创建表readers的结构如表 9-2示。创建表的同时在r_id列添加名称为ix_r_id的唯一索引。
时间: 2024-05-12 17:13:01 浏览: 37
可以使用以下SQL语句创建表readers并添加唯一索引:
```
CREATE TABLE readers (
r_id INT NOT NULL,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
birthdate DATE NOT NULL,
PRIMARY KEY (r_id),
UNIQUE INDEX ix_r_id (r_id)
);
```
这个SQL语句创建一个名为readers的表,包含r_id、first_name、last_name、email和birthdate五个列。其中r_id列被指定为主键,而且还添加了一个名为ix_r_id的唯一索引,以确保r_id列中的值都是唯一的。
相关问题
1. 按上述说明,设计各表,并插入与如下类似的多条(图书至少含3类、每类图书至少3本书不等)数据。 图书分类表:(1,'古代文学','包括古典诗词、古典文学名著、古代传记文学等');图书表:(1,'三国演义','罗贯中',1);读者表:(1, '张三');借阅记录表:(1,1, '2019/10/10', '2019/10/11')。 2.创建一个函数get_num(c_id),根据图书类别id值,统计每一类图书的数量。 3.创建一个存储过程pro1(in c_id, out num, out catalognames,),根据输入的图书类别c_id调用函数get_num( ),返回该类图书的总数num;并返回各个图书类别及名称的串接catalognames(形如:“1古代文学,2现代文学…”);同时,在存储过程中获取到book_catalogs的最大c_id值,使用while、loop和repeat分别循环(从1~c_id的最大值)打印各c_id及对应c_name值,对比打印结果和catalognames输出的结果,查看其异同,若不同请说明原因。 4.创建一个存储过程pro2(),打印各图书类别都有哪些书。
好的,我理解了你的问题。我将一一回答你的问题。
1. 根据上述说明,我们可以设计以下各表:
```
图书表books(b_id, b_name, author, c_id)
图书分类表book_catalogs(c_id, c_name, detail)
读者表readers(r_id, r_name)
借阅记录表records(re_id, r_id, b_id, lend_date, return_date)
```
其中,各表的主键依次为`b_id`、`c_id`、`r_id`、`re_id`,`books`表的`c_id`作为其外键,参照/引用的`book_catalogs`表的主键`c_id`值;借阅记录表包含`r_id`、`b_id`两个外键(不得为空),分别参照/引用的`readers`表的`r_id`、`books`表的`b_id`值。`books.b_id`唯一标识一本书(物理上唯一标识),此标识不同的两本书有可能内容完全一样。
插入数据可以按照以下方式进行:
```
INSERT INTO book_catalogs(c_id, c_name, detail) VALUES
(1,'古代文学','包括古典诗词、古典文学名著、古代传记文学等'),
(2,'现代文学','包括当代文学、现代小说、诗歌等'),
(3,'科学技术','包括计算机、数学、物理、化学等');
INSERT INTO books(b_id, b_name, author, c_id) VALUES
(1,'红楼梦','曹雪芹',1),
(2,'西游记','吴承恩',1),
(3,'水浒传','施耐庵',1),
(4,'活着','余华',2),
(5,'围城','钱钟书',2),
(6,'白夜行','东野圭吾',2),
(7,'深入浅出设计模式','程杰',3),
(8,'C++ Primer','Lippman',3),
(9,'UNIX环境高级编程','W.Richard Stevens',3);
INSERT INTO readers(r_id, r_name) VALUES
(1, '张三'),
(2, '李四'),
(3, '王五');
INSERT INTO records(re_id, r_id, b_id, lend_date, return_date) VALUES
(1,1,1, '2019/10/10', '2019/10/11'),
(2,2,2, '2019/11/11', '2019/11/12'),
(3,3,3, '2019/12/12', '2019/12/13');
```
2. 根据要求,我们可以创建一个名为`get_num(c_id)`的函数,代码如下:
```
CREATE FUNCTION get_num(c_id INT) RETURNS INT
BEGIN
DECLARE num INT;
SELECT COUNT(*) INTO num FROM books WHERE c_id = c_id;
RETURN num;
END;
```
该函数接收一个参数`c_id`,即图书类别id值,返回该类别的图书数量。
3. 根据要求,我们可以创建一个名为`pro1(in c_id, out num, out catalognames)`的存储过程,代码如下:
```
CREATE PROCEDURE pro1(in c_id INT, out num INT, out catalognames VARCHAR(100))
BEGIN
DECLARE max_cid INT;
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(100) DEFAULT '';
SELECT MAX(c_id) INTO max_cid FROM book_catalogs;
SET num = get_num(c_id);
WHILE i <= max_cid DO
SELECT CONCAT_WS('', i, book_catalogs.c_name) INTO str WHERE book_catalogs.c_id = i;
SET i = i + 1;
END WHILE;
SET catalognames = str;
END;
```
该存储过程接收一个参数`c_id`,返回该类别的图书数量和所有图书类别及名称的串接。我们在该存储过程中调用了上面创建的`get_num()`函数。同时,我们使用了循环打印各c_id及对应c_name值,并将打印结果与`catalognames`输出的结果进行对比,以验证它们是否正确。
4. 根据要求,我们可以创建一个名为`pro2()`的存储过程,代码如下:
```
CREATE PROCEDURE pro2()
BEGIN
SELECT book_catalogs.c_name, books.b_name
FROM books
JOIN book_catalogs
ON books.c_id = book_catalogs.c_id
ORDER BY book_catalogs.c_id;
END;
```
该存储过程直接查询`books`表和`book_catalogs`表,按照图书类别id值排序,返回各图书类别的所有书籍名称。
9.在服务器端libdb数据库中创建Readers表存储读者信息, (1)用SQL Server建立一个数据库,在库中建一张表存贮读者信息,如图4.1所示。 (2)为数据库建立数据源。 (3)设计并编制源代码。
下面是在SQL Server中创建一个名为libdb的数据库,并在该数据库中创建一个名为Readers的表用于存储读者信息的SQL语句:
```
CREATE DATABASE libdb;
GO
USE libdb;
GO
CREATE TABLE Readers (
ReaderID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50) NOT NULL,
Gender CHAR(1),
Age INT,
Email VARCHAR(50),
Phone VARCHAR(20)
);
GO
```
然后,需要为该数据库建立数据源。可以使用Visual Studio等开发工具,或者手动在ODBC数据源管理器中添加一个名为libdb的数据源,指向上述SQL Server数据库。
最后,可以在服务器端编写代码来操作该数据库。以下是一个使用C#语言编写的示例程序,实现了向Readers表中插入一条读者信息的功能:
```csharp
using System;
using System.Data;
using System.Data.SqlClient;
namespace LibDBTest
{
class Program
{
static void Main(string[] args)
{
var connectionString = "Data Source=(local);Initial Catalog=libdb;Integrated Security=True";
var name = "张三";
var gender = "男";
var age = 25;
var email = "zhangsan@example.com";
var phone = "13800000000";
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand("INSERT INTO Readers (Name, Gender, Age, Email, Phone) VALUES (@Name, @Gender, @Age, @Email, @Phone)", connection);
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@Gender", gender);
command.Parameters.AddWithValue("@Age", age);
command.Parameters.AddWithValue("@Email", email);
command.Parameters.AddWithValue("@Phone", phone);
var rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected} 行受影响。");
connection.Close();
}
Console.ReadKey();
}
}
}
```
在该程序中,首先使用SQL Server连接字符串连接到libdb数据库,然后定义要插入的读者信息,包括姓名、性别、年龄、电子邮件和电话。接着,使用SqlConnection和SqlCommand对象执行SQL语句,将读者信息插入到Readers表中。最后,关闭数据库连接。
注意,该程序需要引用System.Data.SqlClient命名空间。可以使用Visual Studio等开发工具创建一个控制台应用程序,并在程序的属性设置中将.NET Framework版本设置为4.5或更高版本,以便使用该命名空间。
阅读全文