CSDN专家-深度学习进阶
码龄4年
关注
提问 私信
  • 博客:93,846
    问答:498,906
    动态:362
    593,114
    总访问量
  • 25
    原创
  • 49,239
    排名
  • 702
    粉丝

个人简介:如果有帮助请给我的回答点一下【采纳】,谢谢! 如有问题,可关注我私信。

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:河北省
  • 加入CSDN时间: 2021-04-23
博客简介:

technologist_41的博客

查看详细资料
个人成就
  • 获得89次点赞
  • 内容获得30次评论
  • 获得244次收藏
  • 代码片获得751次分享
创作历程
  • 8篇
    2023年
  • 8篇
    2022年
  • 9篇
    2021年
成就勋章
TA的专栏
  • bug
    5篇
  • python
    3篇
  • c++
    3篇
  • C
    3篇
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

180人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 视频
  • 课程
搜TA的内容
搜索 取消

求C语言用rsa算法代码

答:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 计算最大公约数
long gcd(long a, long b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

// 快速幂取模
long fast_pow(long base, long exponent, long mod) {
    long result = 1;
    base = base % mod;
    while (exponent > 0) {
        if (exponent % 2 == 1)
            result = (result * base) % mod;
        exponent = exponent >> 1;
        base = (base * base) % mod;
    }
    return result;
}

// 模逆运算
long mod_inverse(long a, long m) {
    long m0 = m, t, q;
    long x0 = 0, x1 = 1;
    if (m == 1)
        return 0;
    while (a > 1) {
        // q 是商
        q = a / m;
        t = m;
        // m 是余数
        m = a % m, a = t;
        t = x0;
        x0 = x1 - q * x0;
        x1 = t;
    }
    return x1 + m0;
}

void generate_keys(long *e, long *d, long *n, long *p, long *q) {
    long phi;
    srand((unsigned int)time(NULL));
    *p = rand() % 10000 + 101; // 随机选择两个小的质数
    *q = rand() % 10000 + 101;
    while (*p % 2 == 0 || *q % 2 == 2) { // 选择奇数质数
        *p = rand() % 10000 + 101;
        *q = rand() % 10000 + 101;
    }
    while (gcd(*p - 1, *q - 1) != 1) { // 保证p和q互质
        *p = rand() % 10000 + 101;
        *q = rand() % 10000 + 101;
    }

    *n = (*p) * (*q); // n是p和q的乘积
    phi = (*p - 1) * (*q - 1); // phi是欧拉函数

    *e = 3; // 选择一个大于1的整数e
    while (*e < phi) {
        if (gcd(*e, phi) == 1) // 确保e和phi互质
            break;
        else
            (*e)++;
    }

    *d = mod_inverse(*e, phi); // 计算e的模逆得到d
}

// 加密
long encrypt(long plaintext, long e, long n) {
    return fast_pow(plaintext, e, n);
}

// 解密
long decrypt(long ciphertext, long d, long n) {
    return fast_pow(ciphertext, d, n);
}

int main() {
    long e, d, n, p, q;
    generate_keys(&e, &d, &n, &p, &q);
    printf("Public Key (e, n): (%ld, %ld)\n", e, n);
    printf("Private Key (d, n): (%ld, %ld)\n", d, n);

    long plaintext = 42; // 明文
    long ciphertext = encrypt(plaintext, e, n);
    printf("Ciphertext: %ld\n", ciphertext);

    long decrypted = decrypt(ciphertext, d, n);
    printf("Decrypted: %ld\n", decrypted);

    return 0;
}
回答问题 2024.09.25

modelsim发疯跳弹窗

答:

把电脑管家退出再用

回答问题 2024.09.25

怎么写啊 谁能浇浇我😭

答:

#include <stdio.h>
#include <string.h>

void decompress(char *input, char *output, int start, int end) {
    int i = start;
    while (i <= end) {
        if (input[i] == '[') {
            int countStart = i + 1;
            int countEnd = i;
            while (input[countEnd] != 'D' && countEnd > countStart) {
                countEnd--;
            }
            int repeatCount = atoi(&input[countStart]);
            i = countEnd + 1;
            char sound[2];
            sound[0] = input[i];
            sound[1] = '\0';
            int j = 0;
            while (j < repeatCount) {
                decompress(input, output, i + 1, end);
                strcat(output, sound);
                j++;
            }
            i++;
        } else {
            output[end - start + i - 1] = input[i];
            i++;
        }
    }
    output[end - start] = '\0';
}

int main() {
    char input[1001];
    scanf("%s", input);
    char output[10000]; // 假设解压缩后的长度不会超过10000
    decompress(input, output, 0, strlen(input) - 1);
    printf("%s\n", output);
    return 0;
}
回答问题 2024.09.25

数据分析的基本步骤通常包括以下几个方面

答:

数据分析的简化步骤通常包括:

  1. 定义目标:明确分析的目的和问题。

  2. 收集数据:获取所需的数据。

  3. 清洗数据:修正错误,处理缺失值和异常值。

  4. 探索数据:通过统计和可视化方法了解数据特征。

  5. 预处理数据:准备数据,包括转换和特征工程。

  6. 建立模型:选择并训练模型。

  7. 评估模型:使用测试数据评估模型性能。

  8. 解释结果:分析模型输出,提取洞察。

  9. 呈现结果:制作报告或演示文稿。

  10. 部署模型(如果适用):将模型应用于实际环境中。

  11. 监控和维护(如果适用):确保模型在生产环境中表现良好。

这些步骤提供了一个简洁的数据分析流程。

回答问题 2024.09.25

数据结构的头插法问题

答:

class SequentialList:
    def __init__(self):
        self.data = []

    def insert_at_beginning(self, element):
        """头插法插入元素"""
        self.data.insert(0, element)

    def insert_at_index(self, index, element):
        """在指定索引位置插入元素"""
        if index <= len(self.data) and index >= 0:
            self.data.insert(index, element)
        else:
            print(f"Index {index} is out of bounds.")

    def delete_first_element(self):
        """删除首节点"""
        if self.data:
            self.data.pop(0)
        else:
            print("List is empty.")

    def display(self):
        """显示顺序表"""
        print(self.data)

# 已知列表
lst = [23, 13, 9, 8, 1, 0, 46]
# 创建顺序表实例
seq_list = SequentialList()

# 通过头插法构建顺序表
for element in lst:
    seq_list.insert_at_beginning(element)
print("After constructing with head insertion:")
seq_list.display()

# 在索引0、3、5位置分别插入元素10
seq_list.insert_at_index(0, 10)
seq_list.insert_at_index(3, 10)
seq_list.insert_at_index(5, 10)
print("After inserting 10 at indices 0, 3, and 5:")
seq_list.display()

# 删除首结点
seq_list.delete_first_element()
print("After deleting the first element:")
seq_list.display()
回答问题 2024.09.25

如果只给一个vue的html文件给你,如何将html文件传上阿里云服务器?

答:

将html页面部署到阿里云服务器_阿里云ecs公网ip访问html-CSDN博客 文章浏览阅读6k次,点赞15次,收藏76次。阿里云服务器部署一、购买阿里云服务器ECS并选择镜像二、进行配置1.配置安全组2.宝塔Linux面板配置三、进行部署1.安装Nginx四、效果展示一、购买阿里云服务器ECS并选择镜像镜像-镜像市场-搜索宝塔Linux面板进行安装,其余参数选择默认即可若镜像选择错误也可以进行如下操作:1.先将实例停止2.再更换操作系统3.搜索宝塔Linux面板4.自定义密码二、进行配置1.配置安全组配置安全组,使得之后的端口可以访问点击配置规则手动添加80和8888端口80为外部访问端口_阿里云ecs公网ip访问html https://blog.csdn.net/kkill_youokk_/article/details/111416363

回答问题 2024.04.11

微信上的好友收发信息在收发信息技术领域中仅仅用handler机制行吗?

答:

回答参考gpt4:微信上的好友收发信息并不仅仅依赖于handler机制。实际上,一个成熟的即时通讯系统如微信,在收发信息的技术实现上,涵盖了多种技术和架构模式,以确保信息的即时性、安全性、可靠性和高效性。以下是几个关键的技术组件和机制:

  1. 网络连接和传输协议:微信可能会使用TCP/IP协议作为基础的网络通信协议,同时结合更高效的协议(如MQTT或者自定义的协议)来优化移动环境下的数据传输,减少延迟和数据消耗。

  2. 消息队列和异步处理:为了处理大量的并发消息,微信后端架构可能会使用消息队列(如Kafka)来异步处理消息的发送和接收,确保系统的可扩展性和高性能。

  3. Handler机制:在客户端,尤其是Android平台上,handler机制确实是一个常用的技术,用于处理线程间的通信,比如UI线程和后台线程之间的消息传递。但这只是客户端处理消息的一部分,主要用于确保界面的响应性和流畅性。

  4. 服务器架构:微信的服务器架构可能包括负载均衡器、消息服务器、数据库和缓存等组件,来支持大规模的数据处理和存储。

  5. 数据存储和同步:为了确保用户消息的持久化和多设备同步,微信需要在服务器端有效地存储和管理消息数据,同时还要考虑数据的安全性和隐私保护。

  6. 加密和安全机制:为了保护用户数据的安全,微信在传输和存储消息时会使用加密技术,如TLS/SSL加密传输数据,以及可能的端到端加密(E2EE)来增加消息内容的安全性。

总之,微信上的好友收发信息的技术实现是一个复杂的系统工程,涉及到前端的用户界面处理、网络通信、后端服务处理、数据存储和安全等多个方面。Handler机制只是其中的一小部分,主要用于客户端开发中的线程通信和事件处理。

回答问题 2024.04.11

微信里向好友发消息,然后好友收到信息,在android上用的是什么技术?

答:

回答参考gpt4:微信向好友发送消息,好友在Android设备上收到消息,这个过程涉及几个关键技术和概念:

  1. 客户端与服务器通信:微信客户端(发送方)首先将消息发送到微信的服务器,然后服务器再将消息转发给接收方的客户端(好友的Android设备)。这个过程通常使用HTTP(S)协议或者更专为即时通信设计的协议如XMPP。

  2. 推送通知技术:当消息被转发到接收方的服务器上后,为了能让接收方的客户端(即使在后台运行或者没有运行)知道有新消息,微信会利用Android的推送通知服务,如Firebase Cloud Messaging (FCM)。通过FCM,微信服务器可以向接收方的设备发送一个推送通知,通知设备有新消息到达。

  3. 长连接技术:为了保持客户端与服务器之间的实时通信,减少延迟,微信客户端通常会与服务器保持一个长连接(而不是每次通信都重新建立连接)。这样可以实时接收消息。长连接通常通过心跳包(定期发送的小数据包)来保持活跃,避免被网络设备(如路由器)断开。

  4. 数据加密和安全:为保证通信安全,防止数据被截获和篡改,微信在客户端与服务器之间的数据传输采用了加密技术。这包括消息内容的加密和身份验证机制,确保消息的安全和隐私。

  5. 离线消息和数据同步:如果接收方的设备离线或未能即时接收消息,微信服务器会保存这些消息,直到设备再次在线并请求同步消息为止。这个过程涉及到数据的存储和同步技术,确保消息不会因为网络问题而丢失。

综上所述,微信消息的发送和接收是一个复杂的过程,涉及到客户端与服务器的通信、移动推送通知服务、网络长连接、数据加密和安全以及离线消息处理等多个方面的技术。

回答问题 2024.04.11

hive部署完了,然后启动不了

答:

报错主要是 Illegal to have multiple roots,检查其中的文件配置信息:hive-site.xml
配置信息有错误,或者多写了都会造成这个错误

img

回答问题 2024.04.11

python中有带毫秒的时间元组结构么?

答:

回答参考gpt:由于 struct_time 对象的设计,它并不直接支持毫秒级别的时间。如果需要处理毫秒级别的时间,可以保留时间戳的浮点数值,或者使用其他方法来处理毫秒。
例如,如果有一个时间戳 timestamp 并希望获取毫秒级别的 struct_time,可以这样做:

import time

# 获取当前时间戳
timestamp = time.time()

# 获取不包含毫秒的struct_time
struct_time_without_milliseconds = time.localtime(timestamp)

# 从时间戳中提取毫秒
milliseconds = int((timestamp - int(timestamp)) * 1000)

# 结合struct_time和毫秒
# 注意:这种方法不会改变struct_time对象本身,它只是在外部附加了毫秒信息
struct_time_with_milliseconds = (struct_time_without_milliseconds, milliseconds)

上述代码首先获取了一个时间戳,然后使用 time.localtime() 函数将其转换为不包含毫秒的 struct_time 对象。接着从时间戳中提取毫秒部分,并将其作为一个单独的整数。最后创建了一个包含 struct_time 对象和毫秒的元组,但请注意,这个元组并不是 time 模块的一部分,它只是自定义的一个数据结构,用于同时存储 struct_time 和毫秒信息。

回答问题 2024.04.10

求以下存储器问题示意图

答:

img

回答问题 2024.04.10

为什么这段拟合曲线代码运行不了呢?求各位高见!

答:

img

回答参考gpt1. 输入数据的判断条件问题:
使用了type(s) == type(1.025)来判断输入的是否为浮点数。这个条件判断是不准确的,因为type(1.025)实际上是<class 'float'>,而input()函数返回的是一个字符串类型。正确的做法是使用try-except语句来捕获可能的异常,确保输入的是一个有效的数字。

  1. np.polyfit函数的使用:
    np.polyfit函数用于执行多项式拟合。代码中使用了np.polyfit(x, y, 1),这表示想要进行一次多项式(线性)拟合。如果想要进行其他次数的拟合,需要将1更改为相应的次数。
import numpy as np
import matplotlib.pyplot as plt

# 用于存储输入的X和Y数据
x = []
y = []

# 输入X拟合数据
print("请输入X拟合数据,每输入一个按回车,按Q键退出本次输入:")
while True:
    try:
        s = input()
        if s.lower() == 'q':
            break
        else:
            x.append(float(s))
    except ValueError:
        print("输入无效,请输入一个有效的数字。")

# 输入Y拟合数据
print("请输入Y拟合数据,每输入一个按回车,按Q键退出本次输入:")
while True:
    try:
        s = input()
        if s.lower() == 'q':
            break
        else:
            y.append(float(s))
    except ValueError:
        print("输入无效,请输入一个有效的数字。")

# 将输入的数据转换为NumPy数组
x = np.array(x)
y = np.array(y)

# 进行线性拟合
fit = np.polyfit(x, y, 1)
p1 = np.poly1d(fit)

# 绘制原始数据点和拟合线
plt.plot(x, y, 'b*', label='原值')
yvals = p1(x)
plt.plot(x, yvals, 'r-', label='拟合线')

# 添加坐标轴标签和标题
plt.xlabel('x')
plt.ylabel('y')
plt.title('拟合图像')

# 显示图例
plt.legend()

# 显示图像
plt.show()
回答问题 2024.04.10

操作系统生产者消费者问题第六个

答:

回答参考gpt:1. 缓冲区满时生产者无法继续生产:在生产者进程中,wait(empty) 应该在 wait(mutex) 之后,以确保在进入缓冲区之前检查缓冲区是否已满。
2. 消费者在缓冲区空时无法继续消费:在消费者进程中,wait(full) 应该在 wait(mutex) 之后,以确保在进入缓冲区之前检查缓冲区是否为空。
3. 信号量使用不当:在生产者和消费者的 signal 操作中,应该先释放互斥信号量(signal(mutex)),再信号缓冲区已满或已空(signal(empty) 或 signal(full)),以避免可能的死锁。

改正建议:

// 生产者进程
Producer():
    while (true) {
        nextp = 生产一个产品();
        wait(mutex); // 进入临界区
        wait(empty); // 检查缓冲区是否有足够的空间
        Buffer(in) = nextp; // 将产品放入缓冲区
        in = (in + 1) % n; // 更新缓冲区索引
        signal(mutex); // 离开临界区
        signal(full); // 信号缓冲区已满
    }

// 消费者进程
Consumer():
    while (true) {
        wait(mutex); // 进入临界区
        wait(full); // 检查缓冲区是否有产品可以消费
        nextc = Buffer(out); // 取出产品
        out = (out + 1) % n; // 更新缓冲区索引
        signal(mutex); // 离开临界区
        signal(empty); // 信号缓冲区已空
        消费产品nextc; // 消费产品
    }

在这个改正后的伪代码中,生产者和消费者都在进入缓冲区前等待相应的信号量,这样可以保证在缓冲区操作之前,缓冲区的状态是正确的。同时,生产者在放入产品后,先释放互斥信号量,再信号缓冲区已满;消费者在取出产品后,先释放互斥信号量,再信号缓冲区已空。这样可以避免死锁的发生,并确保生产者和消费者能够正确地协同工作。

回答问题 2024.04.09

怎样把mt管理器的apk文件放到桌面显示?谁有答案?是不是用mt管理器签名是为了apk文件安装入手机后就没有危险警告了?

答:

这是MT的教程

MT管理器 使用手册_mt管理器论坛-CSDN博客 文章浏览阅读1.5k次,点赞8次,收藏22次。关键字:mt管理器 教程MT管理器之安卓apk逆向破解全套视频教程 最新版:https://www.cr173.com/soft/986824.htmlAndroid游戏破解 入门级零基础起步学习破解!MT管理器+修改器使用方法 小白看了绝对有用:https://blog.csdn.net/weixin_43122043/article/details/90358057MT管理器2.8.4最新版(附逆向教程)更新全部教程链接:https://www.52pojie.cn/..._mt管理器论坛 https://blog.csdn.net/freeking101/article/details/108613033

另外MT管理器签名主要是为了确保APK文件的安全性和完整性。签名可以防止第三方篡改应用程序,并且当用户在手机上安装APK文件时,系统会验证APK的签名以确认其来源的真实性,但是否出现警告还取决于手机的安全设置和APK文件的来源

回答问题 2024.04.09

怎样把mt管理器的apk文件放到电脑桌面(注意是电脑桌面)显示?谁有答案?是不是用mt管理器签名是为了apk文件安装入手机后就没有危险警告了?

答:

这是MT的教程

MT管理器 使用手册_mt管理器论坛-CSDN博客 文章浏览阅读1.5k次,点赞8次,收藏22次。关键字:mt管理器 教程MT管理器之安卓apk逆向破解全套视频教程 最新版:https://www.cr173.com/soft/986824.htmlAndroid游戏破解 入门级零基础起步学习破解!MT管理器+修改器使用方法 小白看了绝对有用:https://blog.csdn.net/weixin_43122043/article/details/90358057MT管理器2.8.4最新版(附逆向教程)更新全部教程链接:https://www.52pojie.cn/..._mt管理器论坛 https://blog.csdn.net/freeking101/article/details/108613033

另外MT管理器签名主要是为了确保APK文件的安全性和完整性。签名可以防止第三方篡改应用程序,并且当用户在手机上安装APK文件时,系统会验证APK的签名以确认其来源的真实性,但是否出现警告还取决于手机的安全设置和APK文件的来源

回答问题 2024.04.09

为什么Android项目打包后用qq传到手机会报有风险?怎样才能永久没有风险?

答:

现在安卓没有备案的好像都报风险,具体可参考

安卓风险包处理方案 - 知乎 安卓风险包处理方案目前国内安卓包打的五花八门,各种类型或壳子都有,有时候在安卓手机上安装时会提示有风险,阻止用户安装,那么势必会影响我们的激活率,下文以华为安装报风险为例,如何解决报风险问题及如何打… https://zhuanlan.zhihu.com/p/540339637

回答问题 2024.04.09

GIS操作中河流链接失败怎么办

答:

可能是电脑配置问题,无法处理2个并行线程

img


在环境设置中寻找关于多线程的设置

img


环境设置中找到了并行处理,将其改为0。即不跨多个进程进行操作

img

img

回答问题 2024.04.09

编写Java对给定函数进行微分计算

答:

img

import java.util.function.DoubleUnaryOperator;
public class Main {
    public static void main(String[] args) {
        double x = 1; // 待求导的点
        double h = 1e-6; // 增量值(可根据精度要求调整)

        // 定义被积函数
        DoubleUnaryOperator f = xVal -> 1 / (1 + Math.exp(-0.085 * xVal));

        // 计算中心差分
        double derivativeApproximation = (f.applyAsDouble(x + h) - f.applyAsDouble(x - h)) / (2 * h);

        System.out.println(derivativeApproximation);
    }
}

回答问题 2024.04.09

编写Java程序进行定积分运算

答:

回答参考gpt:1.

import java.util.function.DoubleUnaryOperator;
public class Main {
    public static void main(String[] args) {
        double a = 0;
        double b = 1;
        int n = 1000; // 增加n值可以提高精度
        double integral = trapezoidalRule(a, b, n, x -> 4 / (1 + Math.pow(x, 2)));
        System.out.printf(" %.6f%n",integral);
    }
    public static double trapezoidalRule(double a, double b, int n, DoubleUnaryOperator f) {
        double h = (b - a) / n;
        double sum = 0.5 * (f.applyAsDouble(a) + f.applyAsDouble(b));

        for (int i = 1; i < n; i++) {
            double x = a + i * h;
            sum += f.applyAsDouble(x);
        }

        return sum * h;
    }
}

2.

import java.util.function.DoubleUnaryOperator;
public class Main {
    public static void main(String[] args) {
        double a = 0;
        double b = 1;
        int n = 1000; // 增加n值可以提高精度
        double integral = trapezoidalRule(a, b, n,  x -> Math.sin(x) - Math.cos(x));
        System.out.printf(" %.6f%n",integral);
    }
    public static double trapezoidalRule(double a, double b, int n, DoubleUnaryOperator f) {
        double h = (b - a) / n;
        double sum = 0.5 * (f.applyAsDouble(a) + f.applyAsDouble(b));

        for (int i = 1; i < n; i++) {
            double x = a + i * h;
            sum += f.applyAsDouble(x);
        }

        return sum * h;
    }
}


3.由于这是一个二维区域上的二重积分,需要采用两个嵌套循环来实现。仍使用简单的龙贝格积分法,但分别对x和y进行离散化,并计算相应的梯形面积。

import java.util.*;
public class Main {


    public static void main(String[] args) {
        double xMin = -1;
        double xMax = 1;
        double yMin = -1;
        double yMax = 1;
        int nx = 100; // 增加nx和ny值可提高精度
        int ny = 100;

        double integral = doubleTrapezoidalRule(xMin, xMax, yMin, yMax, nx, ny);

        System.out.printf("%.6f%n", integral);
    }

    public static double doubleTrapezoidalRule(double xMin, double xMax, double yMin, double yMax, int nx, int ny) {
        double dx = (xMax - xMin) / nx;
        double dy = (yMax - yMin) / ny;

        double totalIntegral = 0.0;

        for (int j = 0; j <= ny; j++) {
            double y = yMin + j * dy;
            for (int i = 0; i <= nx; i++) {
                double x = xMin + i * dx;
                double fValue = Math.pow(x, 2) + Math.pow(y, 2);
                if (i == 0 || i == nx || j == 0 || j == ny) {
                    totalIntegral += 0.25 * fValue * dx * dy; // For corners and edges, use quarter area
                } else {
                    totalIntegral += fValue * dx * dy; // For inner points, use full area
                }
            }
        }

        return totalIntegral;
    }
}

回答问题 2024.04.09

mySQL这个实训怎么做

答:
回答参考Claude 3:1. 使用命令行方式完成以下操作:
(1) 创建数据库:


CREATE DATABASE LibraryDB;
CREATE DATABASE MyTest;



(2) 打开LibraryDB数据库:
USE LibraryDB;

(3) 在LibraryDB中创建读者表和读者类型表:
CREATE TABLE 读者表 (
    读者编号 CHAR(6) NOT NULL PRIMARY KEY,
    姓名 CHAR(10) NOT NULL,
    类别号 CHAR(2) NOT NULL,
    单位 VARCHAR(20),
    有效性 CHAR(10)
);

CREATE TABLE 读者类型表 (
    类别号 CHAR(2) NOT NULL PRIMARY KEY,  
    类名 CHAR(10) NOT NULL,
    可借数量 INT NOT NULL,
    可借天数 INT NOT NULL
);

(4) 显示MySQL服务器中数据库信息:
SHOW DATABASES;

(5) 显示LibraryDB数据库中表信息:  
USE LibraryDB;
SHOW TABLES;

(6) 删除MyTest数据库:
DROP DATABASE MyTest;

2. 使用Navicat等图形化管理工具操作:
(1) 打开Navicat,连接MySQL服务器
(2) 在LibraryDB中创建图书表、库存表和借阅表

3. 建立数据完整性约束:
(1) 为读者表指定主键约束:
ALTER TABLE 读者表 ADD CONSTRAINT PK_读者表 PRIMARY KEY (读者编号);

(2) 为读者表创建外键约束:
ALTER TABLE 读者表
ADD CONSTRAINT FK_读者表_读者类型表
FOREIGN KEY (类别号) REFERENCES 读者类型表(类别号)
ON UPDATE CASCADE
ON DELETE CASCADE;

(3) 为借阅表创建外键约束:
ALTER TABLE 借阅表  
ADD CONSTRAINT FK_借阅表_读者表
FOREIGN KEY (读者编号) REFERENCES 读者表(读者编号)
ON DELETE RESTRICT
ON UPDATE RESTRICT;

(4) 为借阅表创建外键约束:
ALTER TABLE 借阅表
ADD CONSTRAINT FK_借阅表_库存表  
FOREIGN KEY (条码) REFERENCES 库存表(条码)
ON UPDATE CASCADE
ON DELETE CASCADE;  

(5) 修改读者类型表,添加约束: 
ALTER TABLE 读者类型表
ADD CONSTRAINT CK_可借数量
CHECK (可借数量 BETWEEN 0 AND 30);

(6) 修改库存表,添加约束:
ALTER TABLE 库存表
ADD CONSTRAINT CK_库存状态
CHECK (库存状态 IN ('在馆', '借出', '丢失'));



回答问题 2024.04.08
加载更多