注册
达梦数据库日常使用帖
专栏/培训园地/ 文章详情 /

达梦数据库日常使用帖

路边一颗大白菜 2025/02/27 194 0 0
摘要

1 达梦数据库配置
数据库名:DAMENG
实例名:DMSERVER
端口:5236
系统用户:SYSDBA/SYSDBA
默认模式:SYSDBA
2 概念
2.1 用户(User)
定义:用户是数据库中的一个重要概念,代表一个拥有数据库访问权限的账户。每个用户都有特定的权限来执行SQL语句、查询数据、修改数据或创建对象等。
特点:
每个用户都有自己的权限,允许执行特定操作。
用户在达梦数据库中通常与模式同名,即默认情况下,创建一个用户后,会自动创建一个与其同名的模式。
用户可以是数据库的管理员,也可以是普通用户,权限可以通过角色、系统权限等方式进行控制。
2.2 角色(Role)
定义:角色是一种权限集合,它可以被授予给用户。通过使用角色,可以简化权限管理,避免直接授予用户大量权限。
特点:
角色包含了一组权限。通过将角色授予给用户,用户便获得了该角色的所有权限。
角色的使用可以简化管理,提高安全性和灵活性。
可以创建自定义角色来控制不同级别的访问权限。
角色与用户的关系:用户可以被授予多个角色。通过角色来控制用户的权限,避免直接为每个用户单独设置权限。
2.3 模式(Schema)
定义:模式是数据库中的一个命名空间,存放该用户创建的所有数据库对象(如表、视图、存储过程等)。通常情况下,每个用户会有一个与用户名相同的模式,所有属于该用户的对象都位于该模式下。
特点:
在达梦中,模式和用户是紧密关联的。通常情况下,用户的名称与模式的名称相同,因此可以将它们视为同一个概念。
每个用户拥有自己的模式,可以在其中创建和管理数据库对象。
通过权限控制,可以让一个用户访问或管理其他模式下的对象。
模式和用户的关系:每个用户通常对应一个模式,模式的名称通常与用户相同,但不同用户的模式是独立的,互不干扰。
2.4 表空间(Tablespace)
定义:表空间是数据库中存储数据的逻辑容器。它是数据库存储管理的基础,用于组织数据库的物理存储结构。表空间包含了实际的数据文件,这些文件存储了表、索引等数据库对象的数据。
特点:
表空间是物理存储和逻辑组织之间的桥梁,数据库对象的存储位置和管理方式通过表空间来实现。
一个数据库可以有多个表空间,每个表空间可以存储多个数据文件。
表空间是数据库管理的重要概念,通常用于管理数据库的存储空间。
表空间和模式的关系:表空间管理的是存储文件的位置,而模式管理的是数据对象的组织。一个模式中的所有对象(如表、索引等)可以存储在一个或多个表空间中。不同的表可以选择不同的表空间进行存储。
2.5 各概念之间的关系
用户与模式的关系:
在达梦数据库中,用户和模式通常是一一对应的。每个用户创建时会自动拥有一个与其名字相同的模式。
用户可以在自己的模式下创建和管理表、视图等数据库对象。
表空间与数据库对象的关系:
数据库对象(如表、索引等)存储在表空间中。每个表空间包含若干个数据文件,这些文件实际存储了表空间中的所有对象。
你可以指定某个表存储在特定的表空间中,通过表空间管理数据的物理存储。
角色与用户的关系:
用户通过角色获得访问数据库的权限。角色是权限的集合,用户可以通过角色来获得多种权限,而不必逐一赋予权限。
2.6 总结
数据库是存储数据的实际容器。
实例是数据库服务的运行环境,一个实例通常对应一个数据库。
用户是有权限的数据库账户,用户与模式是紧密关联的。
模式是用户的命名空间,用于存储该用户创建的数据库对象。
表空间是物理存储结构的逻辑容器,管理数据库对象的数据文件。
角色是一组权限集合,可以授予给用户,简化权限管理。
3 Windows连接数据库
3.1 使用自带dmcli工具(不推荐)
进入达梦安装目录的bin下面,执行DIsql.exe
然后输入用户名和密码

3.2 使用达梦自带的数据库管理工具(推荐)
双击打开DM管理工具。

点击新建连接按钮。
弹窗输入主机名(ip)、端口、用户名、密码、连接名等即可。

3.3 使用SQLARK百灵连接(推荐)

3.4 JDBC连接
3.4.1 Maven依赖
<!--达梦数据库 -->
<dependency>
<groupId>com.dm</groupId>
<artifactId>DmJdbcDriver</artifactId>
<version>18</version>
</dependency>
3.4.2 示例代码
import java.sql.;
import java.io.
;
import java.math.BigDecimal;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

/**

  • 基本的 JDBC 操作示例,包括连接数据库、插入数据、查询数据、更新数据、删除数据和调用存储过程。
    */
    public class BasicApp {

    // 定义 DM JDBC 驱动类
    private static final String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM 数据库连接 URL
    private static final String urlString = "jdbc:dm://localhost:5236";
    // 定义连接用户名
    private static final String userName = "SYSDBA";
    // 定义连接用户口令
    private static final String password = "SYSDBA";

    private Connection conn = null; // 数据库连接对象

    /**

    • 加载 JDBC 驱动程序
    • @throws SQLException 如果加载驱动程序失败,抛出 SQLException 异常
      */
      public void loadJdbcDriver() throws SQLException {
      try {
      System.out.println("加载 JDBC 驱动...");
      Class.forName(jdbcString); // 加载 DM JDBC 驱动
      } catch (ClassNotFoundException e) {
      throw new SQLException("加载 JDBC 驱动失败: " + e.getMessage());
      }
      }

    /**

    • 连接到 DM 数据库
    • @throws SQLException 如果连接数据库失败,抛出 SQLException 异常
      */
      public void connect() throws SQLException {
      try {
      System.out.println("连接到 DM 数据库...");
      conn = DriverManager.getConnection(urlString, userName, password); // 获取数据库连接
      } catch (SQLException e) {
      throw new SQLException("连接 DM 数据库失败: " + e.getMessage());
      }
      }

    /**

    • 关闭数据库连接
    • @throws SQLException 如果关闭连接失败,抛出 SQLException 异常
      */
      public void disConnect() throws SQLException {
      try {
      if (conn != null && !conn.isClosed()) {
      conn.close(); // 关闭连接
      }
      } catch (SQLException e) {
      throw new SQLException("关闭连接失败: " + e.getMessage());
      }
      }

    /**

    • 向产品表插入单条数据

    • @throws SQLException 如果插入数据失败,抛出 SQLException 异常
      */
      public void insertTable() throws SQLException {
      String sql = "INSERT INTO production.product(name, author, publisher, publishtime, " +
      "product_subcategoryid, productno, satetystocklevel, originalprice, nowprice, " +
      "discount, description, photo, type, papertotal, wordtotal, sellstarttime, sellendtime) " +
      "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";

      try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
      // 设置插入的数据
      pstmt.setString(1, "三国演义");
      pstmt.setString(2, "罗贯中");
      pstmt.setString(3, "中华书局");
      pstmt.setDate(4, Date.valueOf("2005-04-01"));
      pstmt.setInt(5, 4);
      pstmt.setString(6, "9787101046121");
      pstmt.setInt(7, 10);
      pstmt.setBigDecimal(8, new BigDecimal(19.0000));
      pstmt.setBigDecimal(9, new BigDecimal(15.2000));
      pstmt.setBigDecimal(10, new BigDecimal(8.0));
      pstmt.setString(11, "《三国演义》是中国第一部长篇章回体小说...");

      // 插入图片大字段数据
      try {
      String filePath = "c:\三国演义.jpg";
      createImage(filePath); // 创建图片文件
      File file = new File(filePath);
      try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
      pstmt.setBinaryStream(12, in, (int) file.length()); // 设置大字段
      }
      } catch (FileNotFoundException e) {
      pstmt.setNull(12, java.sql.Types.BINARY); // 图片文件未找到时插入 NULL
      }

      pstmt.setString(13, "25");
      pstmt.setInt(14, 943);
      pstmt.setInt(15, 93000);
      pstmt.setDate(16, Date.valueOf("2006-03-20"));
      pstmt.setDate(17, Date.valueOf("1900-01-01"));

      pstmt.executeUpdate(); // 执行插入操作
      System.out.println("单条数据插入成功");
      }
      }

    /**

    • 向产品表批量插入数据

    • @param numberOfRecords 插入的记录数

    • @throws SQLException 如果插入数据失败,抛出 SQLException 异常
      */
      public void batchInsert(int numberOfRecords) throws SQLException {
      String sql = "INSERT INTO production.product(name, author, publisher, publishtime, " +
      "product_subcategoryid, productno, satetystocklevel, originalprice, nowprice, " +
      "discount, description, photo, type, papertotal, wordtotal, sellstarttime, sellendtime) " +
      "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";

      try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
      // 批量插入数据
      for (int i = 1; i <= numberOfRecords; i++) {
      // 设置每条数据的字段
      pstmt.setString(1, "书名" + i);
      pstmt.setString(2, "作者" + i);
      pstmt.setString(3, "出版社" + i);
      pstmt.setDate(4, Date.valueOf("2023-01-01"));
      pstmt.setInt(5, i);
      pstmt.setString(6, "97871010" + i);
      pstmt.setInt(7, 100);
      pstmt.setBigDecimal(8, new BigDecimal(20.00));
      pstmt.setBigDecimal(9, new BigDecimal(15.00));
      pstmt.setBigDecimal(10, new BigDecimal(10.0));
      pstmt.setString(11, "描述" + i);

      // 插入图片大字段数据
      try {
      String filePath = "c:\图片" + i + ".jpg";
      createImage(filePath); // 创建图片文件
      File file = new File(filePath);
      try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
      pstmt.setBinaryStream(12, in, (int) file.length()); // 设置大字段
      }
      } catch (FileNotFoundException e) {
      pstmt.setNull(12, java.sql.Types.BINARY); // 图片文件未找到时插入 NULL
      }

      pstmt.setString(13, "类型" + i);
      pstmt.setInt(14, i * 10);
      pstmt.setInt(15, i * 100);
      pstmt.setDate(16, Date.valueOf("2023-02-01"));
      pstmt.setDate(17, Date.valueOf("2023-03-01"));

      // 将每条数据添加到批处理中
      pstmt.addBatch();

      // 每插入 1000 条数据执行一次批处理,防止内存占用过高
      if (i % 1000 == 0 || i == numberOfRecords) {
      pstmt.executeBatch(); // 执行批量插入
      System.out.println("插入了 " + i + " 条数据");
      }
      }
      }
      }

    /**

    • 查询单条产品信息

    • @throws SQLException 如果查询数据失败,抛出 SQLException 异常
      */
      public void queryProduct() throws SQLException {
      String sql = "SELECT productid, name, author, description, photo FROM production.product WHERE productid=11";

      try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
      displayResultSet(rs); // 显示查询结果
      }
      }

    /**

    • 修改产品信息

    • @throws SQLException 如果更新数据失败,抛出 SQLException 异常
      */
      public void updateTable() throws SQLException {
      String sql = "UPDATE production.product SET name = ? WHERE productid = 11;";

      try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
      pstmt.setString(1, "三国演义(上)");
      pstmt.executeUpdate(); // 执行更新操作
      }
      }

    /**

    • 删除产品信息

    • @throws SQLException 如果删除数据失败,抛出 SQLException 异常
      */
      public void deleteTable() throws SQLException {
      String sql = "DELETE FROM production.product WHERE productid = 11;";

      try (Statement stmt = conn.createStatement()) {
      stmt.executeUpdate(sql); // 执行删除操作
      }
      }

    /**

    • 查询所有产品信息

    • @throws SQLException 如果查询数据失败,抛出 SQLException 异常
      */
      public void queryTable() throws SQLException {
      String sql = "SELECT productid, name, author, publisher FROM production.product";

      try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
      displayResultSet(rs); // 显示查询结果
      }
      }

    /**

    • 调用存储过程更新产品信息

    • @throws SQLException 如果调用存储过程失败,抛出 SQLException 异常
      */
      public void updateProduct() throws SQLException {
      String sql = "{ CALL production.updateProduct(?,?) }";

      try (CallableStatement cstmt = conn.prepareCall(sql)) {
      cstmt.setInt(1, 1); // 设置参数
      cstmt.setString(2, "红楼梦(上)");
      cstmt.execute(); // 执行存储过程
      }
      }

    /**

    • 显示查询结果

    • @param rs 结果集对象

    • @throws SQLException 如果处理结果集时出错,抛出 SQLException 异常
      */
      private void displayResultSet(ResultSet rs) throws SQLException {
      ResultSetMetaData rsmd = rs.getMetaData();
      int numCols = rsmd.getColumnCount();

      // 打印列名
      for (int i = 1; i <= numCols; i++) {
      if (i > 1) {
      System.out.print(", ");
      }
      System.out.print(rsmd.getColumnLabel(i));
      }
      System.out.println("");

      // 打印每一行的数据
      while (rs.next()) {
      for (int i = 1; i <= numCols; i++) {
      if (i > 1) {
      System.out.print(", ");
      }
      System.out.print(rs.getString(i));
      }
      System.out.println("");
      }
      }

    /**

    • 创建一个图片文件,用于插入大字段数据

    • @param path 图片文件路径

    • @throws IOException 如果文件创建过程中出错,抛出 IOException 异常
      */
      private void createImage(String path) throws IOException {
      int width = 100;
      int height = 100;
      String text = "三国演义";

      File file = new File(path);
      Font font = new Font("Serif", Font.BOLD, 10);
      BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      Graphics2D g2 = (Graphics2D) bi.getGraphics();

      g2.setBackground(Color.WHITE);
      g2.clearRect(0, 0, width, height);
      g2.setPaint(Color.RED);

      FontRenderContext context = g2.getFontRenderContext();
      Rectangle2D bounds = font.getStringBounds(text, context);
      double x = (width - bounds.getWidth()) / 2;
      double y = (height - bounds.getHeight()) / 2;
      double ascent = -bounds.getY();
      double baseY = y + ascent;

      g2.drawString(text, (int) x, (int) baseY); // 绘制文本
      ImageIO.write(bi, "jpg", file); // 保存为 JPG 文件
      }

    /**

    • 主方法,运行数据库操作
    • @param args 命令行参数
      */
      public static void main(String args[]) {
      try {
      BasicApp basicApp = new BasicApp();
      basicApp.loadJdbcDriver(); // 加载 JDBC 驱动
      basicApp.connect(); // 连接数据库
      basicApp.insertTable(); // 单条插入数据
      // 或者使用批量插入
      // basicApp.batchInsert(5000); // 批量插入 5000 条数据
      basicApp.queryProduct(); // 查询产品数据
      basicApp.queryTable(); // 查询所有产品数据
      basicApp.updateTable(); // 更新数据
      basicApp.deleteTable(); // 删除数据
      basicApp.updateProduct(); // 调用存储过程更新数据
      basicApp.disConnect(); // 断开数据库连接
      } catch (SQLException e) {
      System.out.println(e.getMessage());
      }
      }
      }

3.5 总结

  1. 不建议使用DLsql
  2. 如果本机操作,建议使用DM管理工具
  3. 如果是想在A机器上操作B机器的达梦数据库
    a) 在A机器上安装达梦数据库,然后使用A机器的DM管理工具连接B机器的达梦数据库实例IP端口等
    b) 在A机器上安装SQLark百灵,然后使用百灵连接B机器的达梦数据库。
  4. 代码操作,使用JDBC
    4 数据库操作
    4.1 操作表空间
    -- 创建表空间
    CREATE TABLESPACE "BOOKSHOP" DATAFILE 'D:\Programs\dameng\data\DAMENG\BOOKSHOP.DBF' SIZE 150 AUTOEXTEND ON MAXSIZE 16777215 CACHE = NORMAL;
    -- 修改表空间大小
    alter tablespace 表空间名 resize datafile '数据文件路径' to 数据文件大小(单位为mb);
    alter tablespace dmtbs resize datafile 'DMTBS01.DBF' to 64;
    -- 修改表空间开启自动增长,增长步长,最大表空间
    alter tablespace 表空间名 datafile '数据文件路径' autoextend on next 增长步长 maxsize 文件最大值;
    alter tablespace dmtbs datafile 'DMTBS01.DBF' autoextend on next 2 maxsize 10240;
    -- 修改表空间名称
    alter tablespace 修改前表空间名 rename to 修改后表空间名;
    alter tablespace dmtbs rename to dmtest;
    -- 增加表空间下的数据文件
    alter tablespace 表空间名 add datafile '数据文件路径' size 数据文件大小(单位为mb);
    alter tablespace dmtbs add datafile 'DMTBS02.DBF' size 64;
    -- 删除表空间
    -- 用户自定义的表空间可以删除和脱机,系统定义的表空间不能脱机和删除
    -- 删除后表空间下的数据文件也会级联删除
    drop tablesapce 表空间名;
    drop tablespace dmtest;
    4.2 操作用户
    -- 创建用户,不指定表空间,会使用默认表空间SYS
    create user 用户名 identified by 密码 default tablespace 表空间名;
    create user hrtest identified by "Dmeng123";

-- 删除用户
-- CASCADE 选项表示删除用户以及该用户下的所有对象,包括表、视图、存储过程等。
DROP USER user1 CASCADE;

-- 修改用户密码
ALTER USER user1 IDENTIFIED BY newpassword123;

-- 为用户授予权限
GRANT CREATE SESSION TO user1;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO user1;

-- 授予对象权限
-- 对象权限是对数据库对象(如表、视图、存储过程等)的访问权限。使用 GRANT 语句授予对象权限。例如,授予 user1 用户对 products 表的 SELECT 权限:
GRANT SELECT ON products TO user1;
GRANT SELECT, INSERT, UPDATE ON products TO user1;

-- 为用户创建表空间:先创建一个表空间,然后将用户的默认表空间...
CREATE TABLESPACE user_data DATAFILE '/path_to_file/user_data01.dbf' SIZE 100M;
ALTER USER user1 DEFAULT TABLESPACE user_data;

4.3 操作角色
-- 常见的系统角色包括:
-- DBA:拥有管理数据库的所有权限。
-- RESOURCE:允许用户创建表、视图等。
-- CONNECT:允许用户连接到数据库。
-- 创建角色
CREATE ROLE admin_role;
-- 删除角色
DROP ROLE admin_role;
-- 授予角色权限
GRANT CREATE SESSION, CREATE TABLE TO admin_role;
-- 授予对象权限给角色
GRANT SELECT, INSERT ON products TO admin_role;
-- 授予角色给其他角色
GRANT admin_role TO manager_role;
-- 赋予角色给用户
GRANT admin_role TO user1;
4.4 操作模式
-- 模式
-- 创建模式是通过创建用户来实现的。
-- 模式跟用户是绑定的
-- 删除模式就是删除与之关联的用户。
4.5 操作表
4.5.1 创建表
-- 创建表
CREATE TABLE DMTEST.T_EXAMPLE (
-- 整型字段
ID INT, -- 普通整数
AGE INT, -- 年龄,整型字段
SCORE BIGINT, -- 大整型分数

-- 浮动小数型字段
PRICE DECIMAL(10, 2), -- 商品价格,精度为 10,保留 2 位小数
RATE FLOAT, -- 浮动小数,精度较低
HEIGHT DOUBLE PRECISION, -- 高度,双精度浮动小数

-- 字符串型字段
NAME VARCHAR(50), -- 姓名,最大长度为 50
DESCRIPTION TEXT, -- 说明,文本字段,可变长度

-- 时间日期型字段
CREATED_DATE DATE, -- 创建日期,仅包含日期部分
LAST_MODIFIED DATETIME, -- 最后修改时间,包含日期和时间
BIRTHDAY TIMESTAMP, -- 时间戳,精确到秒

-- 布尔型字段
IS_ACTIVE BIT, -- 是否激活,位类型(0 或 1)

-- 二进制数据字段
PHOTO BLOB, -- 二进制数据,如图片或文件

-- 精确日期时间
EXPIRE_TIME DATETIME, -- 支持精确到秒的日期时间
-- 使用 TEXT 类型来存储 JSON 数据
METADATA TEXT, -- 存储 JSON 格式的字符串

-- UUID 示例
UUID_ID CHAR(36) -- 存储 UUID 字符串
) TABLESPACE HRTBS;

CREATE TABLE DMTEST.T_TESTPID (
PID INT,
PNAME VARCHAR(10),
LOGTIME DATETIME DEFAULT SYSDATE,
SEX BIT
) TABLESPACE HRTBS;

-- 只复制表结构(不带约束信息)
CREATE TABLE T_EMP03 AS SELECT * FROM DMHR.EMPLOYEE WHERE 1=0;

-- 复制表结构+表数据
CREATE TABLE T_EMP01 AS SELECT * FROM DMHR.EMPLOYEE;
CREATE TABLE T_EMP02 LIKE DMHR.EMPLOYEE;
4.5.2 修改表
-- 添加字段
ALTER TABLE DMTEST.T_TESTPID ADD EMAIL VARCHAR(20);

-- 修改字段
ALTER TABLE DMTEST.T_TESTPID MODIFY EMAIL VARCHAR(30);

-- 删除字段
ALTER TABLE DMTEST.T_TESTPID DROP EMAIL;
4.5.3 删除表
-- 删除表
DROP TABLE DMTEST.T_EXAMPLE;
-- 删除表但保留表数据:
TRUNCATE TABLE DMTEST.T_EXAMPLE;
4.5.4 查询表
-- 查询数据
-- 查询所有数据
SELECT * FROM DMTEST.T_EXAMPLE;
-- 查询指定列的数据
SELECT ID, NAME, PRICE, CREATED_DATE FROM DMTEST.T_EXAMPLE;
-- 查询带条件的数据
SELECT * FROM DMTEST.T_EXAMPLE WHERE AGE > 30 AND IS_ACTIVE = 1;
-- 查询并排序
SELECT * FROM DMTEST.T_EXAMPLE ORDER BY AGE DESC; -- 按年龄降序排序
-- 查询前 10 条记录
SELECT * FROM DMTEST.T_EXAMPLE WHERE ROWNUM <= 10;
-- 使用 LIKE 查询模糊匹配数据
SELECT * FROM DMTEST.T_EXAMPLE WHERE NAME LIKE '%张%'; -- 查询名字中包含“张”的记录
-- 使用聚合函数(如 COUNT, AVG, SUM 等)
SELECT COUNT() AS TOTAL_COUNT, AVG(SCORE) AS AVG_SCORE FROM DMTEST.T_EXAMPLE;
-- 使用 GROUP BY 分组查询
SELECT AGE, COUNT(
) AS COUNT FROM DMTEST.T_EXAMPLE GROUP BY AGE;
-- 使用连接查询(JOIN)
SELECT e.ID, e.NAME, d.DEPARTMENT_NAME
FROM DMTEST.T_EXAMPLE e
JOIN DMTEST.T_DEPARTMENT d ON e.ID = d.EMP_ID;
4.6 操作表约束
-- 约束
-- 约束类型
-- NOT NULL:非空约束
-- UNIQUE:唯一约束,可以为空,简写为UK_表名_字段名
-- PRIMARY KEY:主键约束(唯一约束+非空约束),简写为PK_表名_字段名
-- FOREIGN KEY:外键引用约束,引用的是另一张表(父表)的主键或唯一键。简写为FK_表名_字段名
-- CHECK:检验约束,用户校验数据的准确性,简写为CK_表名_字段名
-- 主键约束和唯一约束的区别:一张表只能有一个主键,但是可以有多个唯一约束。

-- 添加主键约束
ALTER TABLE DMTEST.T_TESTPID ADD CONSTRAINT PK_TESTPID_PID PRIMARY KEY("PID");

-- 添加外键约束,注意REFERENCES表里的字段必须是主键或者是添加了唯一索引的字段
ALTER TABLE DMTEST.T_TESTCHILD ADD CONSTRAINT FK_TESTCHILD_PID FOREIGN KEY("PID") REFERENCES DMTEST.T_TESTPID("PID");

-- 添加校验约束
ALTER TABLE DMTEST.T_TESTCHILD ADD CONSTRAINT CK_TESTCHILD_SALARY CHECK ("SALARY" >= 3000);

4.7 操作索引
-- 创建索引
-- 创建单列索引
CREATE INDEX IDX_EXAMPLE_NAME ON DMTEST.T_EXAMPLE(NAME);
-- 创建复合索引
CREATE INDEX IDX_EXAMPLE_AGE_PRICE ON DMTEST.T_EXAMPLE(AGE, PRICE);
-- 删除索引
DROP INDEX IDX_EXAMPLE_NAME;
4.8 操作视图
-- 创建视图,视图基于查询结果
CREATE VIEW VIEW_EMPLOYEES AS
SELECT employee_id, first_name, last_name, department_id
FROM employees
WHERE status = 'ACTIVE';

-- 查询视图中的数据
SELECT * FROM VIEW_EMPLOYEES;
-- 删除旧的视图
DROP VIEW VIEW_EMPLOYEES;

-- 重新创建视图,加入新的字段
CREATE VIEW VIEW_EMPLOYEES AS
SELECT employee_id, first_name, last_name, department_id, hire_date
FROM employees
WHERE status = 'ACTIVE';
-- 删除视图
DROP VIEW VIEW_EMPLOYEES;

-- 授予用户查询视图的权限
GRANT SELECT ON VIEW_EMPLOYEES TO some_user;

-- 撤销用户查询视图的权限
REVOKE SELECT ON VIEW_EMPLOYEES FROM some_user;
-- 查看视图定义
SELECT * FROM USER_VIEWS WHERE VIEW_NAME = 'VIEW_EMPLOYEES';

4.9 插入数据
-- 插入单条数据
INSERT INTO DMTEST.T_EXAMPLE (ID, AGE, SCORE, PRICE, RATE, HEIGHT, NAME, DESCRIPTION, CREATED_DATE, LAST_MODIFIED, BIRTHDAY, IS_ACTIVE, PHOTO, EXPIRE_TIME, METADATA, UUID_ID)
VALUES (1, 25, 9000, 199.99, 3.14, 1.75, '张三', '这个是张三的描述', TO_DATE('2023-05-01', 'YYYY-MM-DD'), SYSDATE, CURRENT_TIMESTAMP, 1, EMPTY_BLOB(), TO_DATE('2023-12-31', 'YYYY-MM-DD'), '{"key": "value"}', '550e8400-e29b-41d4-a716-446655440000');

-- 插入多条
INSERT INTO DMTEST.T_EXAMPLE (ID, AGE, SCORE, PRICE, RATE, HEIGHT, NAME, DESCRIPTION, CREATED_DATE, LAST_MODIFIED, BIRTHDAY, IS_ACTIVE, PHOTO, EXPIRE_TIME, METADATA, UUID_ID)
VALUES (2, 30, 8000, 150.00, 2.89, 1.80, '李四', '这个是李四的描述', TO_DATE('2022-08-15', 'YYYY-MM-DD'), SYSDATE, CURRENT_TIMESTAMP, 1, EMPTY_BLOB(), TO_DATE('2023-06-30', 'YYYY-MM-DD'), '{"key": "another value"}', '550e8400-e29b-41d4-a716-446655440001');

INSERT INTO DMTEST.T_EXAMPLE (ID, AGE, SCORE, PRICE, RATE, HEIGHT, NAME, DESCRIPTION, CREATED_DATE, LAST_MODIFIED, BIRTHDAY, IS_ACTIVE, PHOTO, EXPIRE_TIME, METADATA, UUID_ID)
VALUES (3, 28, 9500, 230.50, 3.67, 1.65, '王五', '王五的个人描述', TO_DATE('2021-12-10', 'YYYY-MM-DD'), SYSDATE, CURRENT_TIMESTAMP, 1, EMPTY_BLOB(), TO_DATE('2023-11-01', 'YYYY-MM-DD'), '{"key": "third value"}', '550e8400-e29b-41d4-a716-446655440002');

-- 插入带图片数据(BLOB 类型):
-- 假设有一张图片文件路径 "c:\example.jpg"
INSERT INTO DMTEST.T_EXAMPLE (ID, AGE, SCORE, PRICE, RATE, HEIGHT, NAME, DESCRIPTION, CREATED_DATE, LAST_MODIFIED, BIRTHDAY, IS_ACTIVE, PHOTO, EXPIRE_TIME, METADATA, UUID_ID)
VALUES (4, 35, 10000, 120.50, 2.45, 1.78, '赵六', '这是赵六的描述', TO_DATE('2020-07-23', 'YYYY-MM-DD'), SYSDATE, CURRENT_TIMESTAMP, 1,
(SELECT BFILE('HRFILE', 'example.jpg') FROM DUAL), TO_DATE('2024-05-31', 'YYYY-MM-DD'), '{"key": "fourth value"}', '550e8400-e29b-41d4-a716-446655440003');
4.10 更新数据
-- 更新数据(UPDATE)
UPDATE DMTEST.T_EXAMPLE SET PRICE = 250.00 WHERE ID = 1;
-- 更新多条记录的数据
UPDATE DMTEST.T_EXAMPLE SET PRICE = PRICE * 1.1 WHERE AGE > 30;
-- 使用 CASE 进行条件更新
UPDATE DMTEST.T_EXAMPLE
SET RATE = CASE
WHEN AGE < 30 THEN 2.5
WHEN AGE BETWEEN 30 AND 40 THEN 3.0
ELSE 3.5
END;
4.11 删除数据
-- 删除数据
DELETE FROM DMTEST.T_EXAMPLE WHERE AGE < 25;
-- 删除所有数据(但保留表结构)
TRUNCATE TABLE DMTEST.T_EXAMPLE;
4.12 总结

  1. 上述SQL语句可以在DLsql中、DM管理工具中、百灵连接中直接使用。
  2. 操作表的时候,请指定模式(DMTEST.T_EXAMPLE)
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服