MySQL_删除

这篇博客探讨了SQL中的删除操作,包括DELETE、TRUNCATE TABLE的使用及其区别。示例展示了如何删除exam_record表中作答时间不足5分钟或未完成的记录,以及如何彻底清空表并重置自增主键。文章还提到了DROPTABLE与DELETE的区别,以及操作的不可逆性和安全性考虑。
DELETE FROM table_name [WHERE Clause]

delete from exam_record
where timestampdiff(minute, start_time, submit_time) < 5
and score < 60;

再深一步:

请删除exam_record表中未完成作答或作答时间小于5分钟整的记录中,开始作答时间最早的3条记录。

delete from exam_record
where timestampdiff(minute, start_time, submit_time) < 5
or submit_time is null 
order by start_time 
limit 3;

再再深一步:

请删除exam_record表中所有记录,并重置自增主键。

sqlite> DELETE FROM table_name;

truncate table exam_record;

补充:

1.DROP TABLE 清除数据并且销毁表,是一种数据库定义语言(DDL Data Definition Language), 执行后不能撤销,被删除表格的关系,索引,权限等等都会被永久删除。

2.TRUNCATE TABLE 只清除数据,保留表结构,列,权限,索引,视图,关系等等,相当于清零数据,是一种数据库定义语言(DDL Data Definition Language),执行后不能撤销。

3.DELETE TABLE 删除(符合某些条件的)数据,是一种数据操纵语言(DML Data Manipulation Language),执行后可以撤销。(还不太明白怎么撤销TT,在什么情况下可以撤销,求大神指点。

运行速度一般DROP最快,DELETE最慢,但是DELETE最安全。

你希望将 `docker-compose.yml` 中的 MySQL 环境变量从硬编码改为从 `.env` 文件中读取,并且使用宿主机上的 MySQL(通过 `host.docker.internal`),这是一个非常常见且推荐的做法。 --- ## ✅ 目标 将以下内容: ```yaml environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: superset MYSQL_USER: superset_user MYSQL_PASSWORD: superset_password ``` 替换为从 `.env` 文件加载,并连接到 **宿主机的 MySQL 实例**(不是容器内的 MySQL)。 --- ## ✅ 第一步:创建 `.env` 文件 在你的项目根目录(`docker-compose.yml` 同级)创建 `.env` 文件: ```bash # .env # MySQL 元数据数据库配置 MYSQL_HOST=host.docker.internal MYSQL_PORT=3306 MYSQL_USER=superset_user MYSQL_PASSWORD=Gapinyc123! MYSQL_DATABASE=superset # Superset 配置(可选) SUPERSET_SECRET_KEY=your-secret-key-here-replace-in-production ``` > ⚠️ 注意:`.env` 文件不会自动被 Git 忽略,请确保将其加入 `.gitignore`,避免泄露密码! --- ## ✅ 第二步:修改 `docker-compose.yml` 使用环境变量 ### ✅ 修改 `mysql` 服务(如果你保留它) 但根据你的需求,你 **不打算运行容器化的 MySQL**,而是连接宿主机的 MySQL。所以你应该 **删除 `mysql` 容器定义**。 👉 删除整个 `services.mysql` 块。 --- ### ✅ 修改 `superset-init` 和 `superset-web` 的环境变量 现在你要让这些服务知道如何连接外部 MySQL。 #### ✅ 示例:`superset-init` 服务 ```yaml superset-init: image: apache/superset:latest container_name: superset-init depends_on: - redis environment: # 数据库连接信息来自 .env - DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE} # 可选:设置 Flask 秘钥 - SUPERSET_SECRET_KEY=${SUPERSET_SECRET_KEY} volumes: - ./init/init-superset.sh:/scripts/init.sh command: ["/scripts/init.sh"] networks: - superset-net ``` #### ✅ 示例:`superset-web` 服务 ```yaml superset: image: apache/superset:latest container_name: superset-web restart: unless-stopped environment: - SUPERSET_CONFIG_PATH=/etc/superset/superset_config.py - FLASK_ENV=production - DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE} - SUPERSET_SECRET_KEY=${SUPERSET_SECRET_KEY} volumes: - ./config:/etc/superset - ./init/init-superset.sh:/scripts/init.sh ports: - "8088:8088" command: > bash -c " echo 'Installing PyMySQL...' && pip install PyMySQL --no-cache-dir && python -c 'import pymysql; pymysql.install_as_MySQLdb()' && echo 'Starting Gunicorn...' && gunicorn \ --bind 0.0.0.0:8088 \ --workers 2 \ --worker-class gthread \ --threads 10 \ --timeout 120 \ --keep-alive 5 \ --max-requests 1000 \ --max-requests-jitter 100 \ --preload \ superset.app:create_app()" depends_on: - superset-init networks: - superset-net ``` --- ## ✅ 第三步:修改 `init-superset.sh` 脚本以等待外部 MySQL 由于你现在连接的是外部 MySQL(可能启动较慢或网络延迟),你需要一个健壮的等待逻辑。 ### ✅ 修改 `./init/init-superset.sh` ```bash #!/bin/sh echo "⏳ Waiting for MySQL at ${MYSQL_HOST}:${MYSQL_PORT} to be reachable..." # 使用 wget 检测端口是否开放 while ! wget --quiet --spider --timeout=3 "http://${MYSQL_HOST}:${MYSQL_PORT}"; do echo "🔴 MySQL (${MYSQL_HOST}:${MYSQL_PORT}) is not reachable yet. Retrying in 3 seconds..." sleep 3 done echo "✅ MySQL is available!" # 开始初始化 flask fab create-admin \ --username admin \ --firstname Admin \ --lastname User \ --email admin@superset.com \ --password admin superset db upgrade superset init echo "🎉 Superset initialization completed." ``` > 💡 提示:如果 `wget` 不可用,可以安装 `nc` 或改用 Python 检测: > > ```sh > python -c "import socket; socket.create_connection(('$MYSQL_HOST', $MYSQL_PORT), timeout=3)" > ``` --- ## ✅ 第四步:确认宿主机 MySQL 允许远程连接 ### ❗ 关键检查项: 1. **MySQL 是否监听外部连接?** 检查 `my.cnf` 或 `mysqld.cnf` 中是否有: ```ini bind-address = 0.0.0.0 ``` 否则默认只允许 `localhost`。 2. **用户是否允许从 Docker 连接?** 登录 MySQL 执行: ```sql CREATE USER 'superset_user'@'%' IDENTIFIED BY 'Gapinyc123!'; GRANT ALL PRIVILEGES ON superset.* TO 'superset_user'@'%'; FLUSH PRIVILEGES; ``` 3. **防火墙是否放行 3306 端口?** - Windows Defender / 防火墙需允许入站 TCP 3306 - Linux 上检查 `ufw` 或 `iptables` 4. **测试连接(可选)** 在容器内临时测试: ```bash docker compose exec superset-init sh wget --spider --timeout=5 http://host.docker.internal:3306 ``` --- ## ✅ 第五步:完整 `docker-compose.yml` 示例(精简版) ```yaml version: '3.8' networks: superset-net: driver: bridge services: redis: image: redis:7-alpine healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 3 start_period: 10s networks: - superset-net superset-init: image: apache/superset:latest depends_on: redis: condition: service_healthy environment: - DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE} - SUPERSET_SECRET_KEY=${SUPERSET_SECRET_KEY} volumes: - ./init/init-superset.sh:/scripts/init.sh command: ["/scripts/init.sh"] networks: - superset-net superset: image: apache/superset:latest container_name: superset-web restart: unless-stopped environment: - SUPERSET_CONFIG_PATH=/etc/superset/superset_config.py - FLASK_ENV=production - DATABASE_URL=mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE} - SUPERSET_SECRET_KEY=${SUPERSET_SECRET_KEY} volumes: - ./config:/etc/superset ports: - "8088:8088" command: > bash -c " pip install PyMySQL --no-cache-dir && \ python -c 'import pymysql; pymysql.install_as_MySQLdb()' && \ gunicorn \ --bind 0.0.0.0:8088 \ --workers 2 \ --worker-class gthread \ --threads 10 \ --timeout 120 \ --keep-alive 5 \ --max-requests 1000 \ --max-requests-jitter 100 \ --preload \ superset.app:create_app()" depends_on: - superset-init networks: - superset-net ``` --- ## ✅ 验证部署 ```bash # 启动 docker compose up -d # 查看日志 docker logs -f superset-init docker logs -f superset-web # 访问 open http://localhost:8088 # 用户名: admin, 密码: admin ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值